我一直想知道一件事,并且找不到任何相关的答案(也许我只是在寻找错误的东西?)为此:
如果派生类退出范围(然后调用析构函数),基类成员也会被销毁(即使析构函数被删除了吗?)。
我得到的想法是析构函数用于删除任何动态内存或关闭任何挂钩(文件等...)。所以,如果我有一个托管成员(例如字符串),它还会被销毁吗?
很抱歉,如果这个问题很愚蠢,或者之前已经回答了! 最诚挚的问候,Erik
答案 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来释放该类中的内存