基础析构函数在派生对象后调用两次?

时间:2010-06-05 12:50:18

标签: c++ gcc polymorphism virtual-destructor

嘿那里,为什么在这个程序结束时基础析构函数被调用了两次?

#include <iostream>
using namespace std;

class B{
public:
  B(){
    cout << "BC" << endl; x = 0;
  }
  virtual ~B(){
    cout << "BD" << endl;
  }
  void f(){
    cout << "BF" << endl;
  }
  virtual void g(){
    cout << "BG" << endl;
  }
private:
  int x;
};

class D: public B{
public:
  D(){
    cout << "dc" << endl; y = 0;
  }
  virtual ~D(){
    cout << "dd" << endl;
  }
  void f(){
    cout << "df" << endl;
  }
  virtual void g(){
    cout << "dg" << endl;
  }
private:
  int y;
};

int main(){
  B b, * bp = &b;
  D d, * dp = &d;
  bp->f();
  bp->g();
  bp = dp;
  bp->f();
  bp->g();
}

2 个答案:

答案 0 :(得分:3)

按顺序调用析构函数,就好像它们展开相应构造函数的效果一样。因此,首先是派生对象的析构函数,然后是基础对象的析构函数。将析构函数设置为虚拟对调用/不调用 基类 析构函数没有任何影响。

另外,您的示例可以通过这种方式简化(此代码也会导致调用基础析构函数两次,派生析构函数一次)

struct A {
   ~A() {
      // ...
   }
};

struct B: A {
   ~B() {
      // ...
   }
};

int main() {
   A a;
   B b;
}

答案 1 :(得分:2)

一旦调用b,一次调用d

注意当D调用它的析构函数自动调用B的析构函数时,它与普通的虚函数不同。你需要显式调用基类函数来使用它。