m**********8 发帖数: 103 | 1 class base{
~base();
};
class derived: public base{
};
int main(int argc, char **argv)
{
derived *d = new derived;
}
为什么给base手动加上一个public的default ctor之后编译会出错,说base::~base()
is private? thanks! |
X****r 发帖数: 3557 | 2 你加的~base()明明是private的啊,你为什么说它是public的呢?
【在 m**********8 的大作中提到】 : class base{ : ~base(); : }; : class derived: public base{ : }; : int main(int argc, char **argv) : { : derived *d = new derived; : } : 为什么给base手动加上一个public的default ctor之后编译会出错,说base::~base()
|
m**********8 发帖数: 103 | 3 不是,我的问题是,上面的程序可以通过编译,但为什么手动加上个base::base()就通
不过了呢?
【在 X****r 的大作中提到】 : 你加的~base()明明是private的啊,你为什么说它是public的呢?
|
X****r 发帖数: 3557 | 4 哦,我知道你的意思了。你手动加上base::base()的话,base的constructor就不是
implicitly declared的了,以至于derived::derived()虽然是implicitly
declared(而且是implicitly defined),但是non-trivial的了,因为
base::base()现在是non-trivial的。
以下是我的推测:对于non-trivial的derived::derived(),它必须能够access
base::~base()。因为当出现exception的时候,如果derived里的base这个子对象
已经被构建了的话,将会被析构(stack unwinding),所以需要调用base::~base()。
【在 m**********8 的大作中提到】 : 不是,我的问题是,上面的程序可以通过编译,但为什么手动加上个base::base()就通 : 不过了呢?
|
m**********8 发帖数: 103 | 5 茅塞顿开。谢谢!
【在 X****r 的大作中提到】 : 哦,我知道你的意思了。你手动加上base::base()的话,base的constructor就不是 : implicitly declared的了,以至于derived::derived()虽然是implicitly : declared(而且是implicitly defined),但是non-trivial的了,因为 : base::base()现在是non-trivial的。 : 以下是我的推测:对于non-trivial的derived::derived(),它必须能够access : base::~base()。因为当出现exception的时候,如果derived里的base这个子对象 : 已经被构建了的话,将会被析构(stack unwinding),所以需要调用base::~base()。
|