8

请考虑以下

class base{
    base();
    ~base();
}:

class derived : public base{

};

当派生对象被析构并且派生类没有定义析构函数时,是否会自动调用基类析构函数?

否则,如果派生类中也有析构函数,是否也需要显式调用基类析构函数?

class base{
    base();
    ~base();
}:

class derived : public base{
     derived();
     ~derived
           base::~base(); //do I need this?
     }
};
4

4 回答 4

14

在这种情况下会自动调用基类析构函数;你不需要调用它

但是,请注意,当通过delete基类指针销毁对象并且析构函数 notvirtual时,结果将是未定义的行为(尽管您可能不会崩溃)。

virtual始终像在任何要派生的类中一样声明析构函数。如果基类不需要具有析构函数,virtual则无论如何都要包含一个带有空主体的析构函数。

对于边缘情况,上述规则有一个例外:如果您的派生类不需要支持多态析构,则析构函数不需要是virtualprotected在这种情况下,改用它是正确的;更多细节在这里,但请注意,这在实践中很少发生。

于 2011-04-05T12:01:17.903 回答
2

当派生对象被析构并且派生类没有定义析构函数时,是否会自动调用基类析构函数?
是的,在派生类析构函数之后会自动调用基类析构函数,而不管派生类析构函数是否被显式定义。

否则,如果派生类中也有析构函数,是否也需要显式调用基类析构函数?
不,你不需要。C++ 中不会有任何场景,除了使用placement new 时,必须显式调用析构函数。

于 2011-04-05T12:08:44.963 回答
1

永远不应该从派生类析构函数调用基类析构函数

原因是基类析构函数将被第二次自动调用,并且以不会导致问题的方式编写析构函数是有问题的 -请参阅这个问题

于 2011-04-05T12:08:11.917 回答
1

不,在这种情况下会自动调用基本析构函数,就像可以自动调用基本构造函数一样。

但是请注意,如果您使用多态性并通过基指针进行销毁,则应确保析构函数是虚拟的,否则会中断。

于 2011-04-05T12:03:18.013 回答