当派生类退出范围时,基本成员是否会被销毁?

时间:2014-04-28 12:59:11

标签: c++ destructor member

我一直想知道一件事,并且找不到任何相关的答案(也许我只是在寻找错误的东西?)为此:

如果派生类退出范围(然后调用析构函数),基类成员也会被销毁(即使析构函数被删除了吗?)。

我得到的想法是析构函数用于删除任何动态内存或关闭任何挂钩(文件等...)。所以,如果我有一个托管成员(例如字符串),它还会被销毁吗?

很抱歉,如果这个问题很愚蠢,或者之前已经回答了! 最诚挚的问候,Erik

2 个答案:

答案 0 :(得分:3)

是的,在销毁派生类的实例时调用基类构造函数。您需要注意的一个案例是,如果您通过指向基地的指针delete派生对象:

class B
{
public:
   ~B();
}

class D : public B
{
public:
   ~D();
};

void f()
{
   B* p = new D();
   delete p; // will (probably) not call ~D()
}

要制作类似上述工作的案例,必须将~B()声明为virtual

class B
{
public:
   virtual ~B();
};

答案 1 :(得分:0)

每当一个对象超出范围时,就会调用它的d-tor - 默认编译器提供的一个或用户提供的一个。

如果对象包含一个基础对象(或多个对象) - 它们的所有d-tors都按类继承定义顺序的相反顺序调用。

然后,如果您需要在其中一个基类中取消分配动态内存,只需确保提供一个d-tor来释放该类中的内存