3

假设我们有:

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 的析构函数。

那么在派生类中编写析构函数的正确方法是什么?我是否总是需要假设父类会负责删除所有内容,但只有派生类有什么?

编辑

  1. 如果是这样,那么如果孩子扩展父类只使用覆盖函数,这是否意味着我将孩子的析构函数留空?

  2. 如果我想改变它怎么办?我的意思是如果我只想调用子析构函数怎么办?有没有办法做到这一点?

4

2 回答 2

6

一句话,是的。

父类的析构函数总是被自动调用。它的工作是释放父类使用的所有资源。

子类的析构函数负责释放特定于子类的东西。

此外,如果您曾经通过指向父类的指针删除子类的实例,则需要将父类的析构函数设为虚拟。请参阅何时使用虚拟析构函数?

于 2012-06-10T18:41:10.650 回答
4

A 的析构函数应该是虚拟的。您的问题在于,如果您执行以下操作:

A* b = new B( iArr, fArr, dArr );
delete b;

然后 B 的析构函数不会被调用,因为 b 在被实例化为 B 时看起来像一个 A 并且 B 的析构函数在虚拟表中没有条目,这意味着它不知道它在那里(即它认为它只是一个 A )

编辑:

In answer to 1 you could leave the destructor empty or you could not define it.

In answer to 2, you can't really do that. You'd be best off having a virtual protected function called "Destroy" or something thats called from the base class destructor. That is the only way I can think of to control destruction like you describe.

于 2012-06-10T18:45:38.327 回答