c++ - 在派生对象之后调用两次基本析构函数?

标签 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();
}

最佳答案

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

还要提一下,您的示例可以这样简化(此代码还会导致调用基析构函数两次和派生析构函数一次):

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

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

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

关于c++ - 在派生对象之后调用两次基本析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980386/

相关文章:

c++ - emacs 完成或 IntelliSense 与 Visual Studio 相同

c - sqrt 仅在参数为非负时定义

c++ - 转发函数指针

c++ - 在模板实例化期间重载查找

c# - 多态空合并运算符

c++ - 模板类中的循环依赖

c++ - 在 VS2010 调试器中可视化 OpenCV 图像

c++ - 如何将模板类与其 friend 模板类分离到不同的头文件中?

c++ - 有没有比使用 dynamic_cast 更快的在运行时检测对象类型的方法?

c# - 如何在给定字符串名称的情况下实例化一个类?