首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要从c++中的派生类调用基析构函数方法吗?

需要从c++中的派生类调用基析构函数方法吗?
EN

Stack Overflow用户
提问于 2011-04-05 19:59:17
回答 3查看 19.9K关注 0票数 8

请考虑以下几点

代码语言:javascript
复制
class base{
    base();
    ~base();
}:

class derived : public base{

};

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

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

代码语言:javascript
复制
class base{
    base();
    ~base();
}:

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-05 20:01:18

在本例中,基类析构函数被自动调用;you do not need to call it

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

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

对于边缘情况,上述规则有一个例外:如果您的派生类不需要支持多态销毁,则析构函数不需要为virtual。在这种情况下,将其改为protectedmore details here是正确的,但请注意,这种情况在实践中很少发生。

票数 14
EN

Stack Overflow用户

发布于 2011-04-05 20:08:45

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

是的,基类析构函数在派生类析构函数之后自动调用,而不管派生类析构函数是否被显式定义。

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

不,你不需要。在C++中不会有任何必须显式调用析构函数的场景,除非使用placement new。

票数 2
EN

Stack Overflow用户

发布于 2011-04-05 20:08:12

您不应该从派生类析构函数中调用基类析构函数。

原因是基类析构函数将被第二次自动调用,以这种方式编写析构函数不会导致问题- see this question

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5551441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档