假设我们有:
class A {
protected:
int* iArr;
float *fArr;
public:
A(int* iArr,float *fArr);
~A();
}
class B : public A {
private:
double *dArr;
public:
B(int* iArr,float *fArr,double *dArr);
~B();
}
我的直觉是它只会调用 B 的析构函数,但是当我在 Visual C++ 上运行它时,我看到在析构 B 的实例时,它同时调用 A 和 B 析构函数。
那么在派生类中编写析构函数的正确方法是什么?我是否总是需要假设父类会负责删除所有内容,但只有派生类有什么?
编辑 :
最佳答案
A 的析构函数应该是虚拟的。您的问题在于,如果您执行以下操作:
A* b = new B( iArr, fArr, dArr );
delete b;
然后 B 的析构函数不会被调用,因为 b 在实例化时 B 看起来像一个 A 并且 B 的析构函数在虚拟表中没有条目,这意味着它不知道它在那里(即它认为它只是一个 A )
编辑:
在回答 1 时,您可以将析构函数留空,或者您无法定义它。
在回答 2 时,你真的不能那样做。您最好拥有一个名为“Destroy”或从基类析构函数调用的虚拟 protected 函数。这是我能想到的像你描述的那样控制破坏的唯一方法。
关于C++ : What is the Right way to delete a derived class instance?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10971327/