假设我们有:

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/

    10-11 19:40
    查看更多