嘿那里,为什么在这个程序结束时基础析构函数被调用了两次?
#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();
}
答案 0 :(得分:3)
按顺序调用析构函数,就好像它们展开相应构造函数的效果一样。因此,首先是派生对象的析构函数,然后是基础对象的析构函数。将析构函数设置为虚拟对调用/不调用 基类 析构函数没有任何影响。
另外,您的示例可以通过这种方式简化(此代码也会导致调用基础析构函数两次,派生析构函数一次):
struct A {
~A() {
// ...
}
};
struct B: A {
~B() {
// ...
}
};
int main() {
A a;
B b;
}
答案 1 :(得分:2)
一旦调用b,一次调用d
注意当D调用它的析构函数自动调用B的析构函数时,它与普通的虚函数不同。你需要显式调用基类函数来使用它。