请考虑以下几点
class base{
base();
~base();
}:
class derived : public base{
};当派生对象被析构并且派生类没有定义析构函数时,是否会自动调用基类析构函数?
否则,如果我在派生类中也有析构函数,我是否也需要显式调用基类析构函数?
class base{
base();
~base();
}:
class derived : public base{
derived();
~derived
base::~base(); //do I need this?
}
};发布于 2011-04-05 20:01:18
在本例中,基类析构函数被自动调用;you do not need to call it。
但是,请注意,当通过基类指针上的delete销毁对象并且析构函数不是virtual__时,结果将是未定义的行为(尽管您可能不会崩溃)。
在任何要派生的类中,始终将析构函数声明为virtual。如果基类不需要析构函数,则无论如何都要包含一个具有空体的virtual析构函数。
对于边缘情况,上述规则有一个例外:如果您的派生类不需要支持多态销毁,则析构函数不需要为virtual。在这种情况下,将其改为protected;more details here是正确的,但请注意,这种情况在实践中很少发生。
发布于 2011-04-05 20:08:45
当派生对象被析构并且派生类没有定义析构函数时,是否会自动调用基类析构函数?
是的,基类析构函数在派生类析构函数之后自动调用,而不管派生类析构函数是否被显式定义。
否则,如果我在派生类中也有析构函数,我是否也需要显式调用基类析构函数?
不,你不需要。在C++中不会有任何必须显式调用析构函数的场景,除非使用placement new。
发布于 2011-04-05 20:08:12
您不应该从派生类析构函数中调用基类析构函数。
原因是基类析构函数将被第二次自动调用,以这种方式编写析构函数不会导致问题- see this question。
https://stackoverflow.com/questions/5551441
复制相似问题