析构函数已经是虚函数了,为何还会调用基类的析构函数
析构函数已经是虚函数了,为什么还会调用基类的析构函数?
我期待的结果是,既然D的析构已经是虚函数了,那么delete pb的时候,就只调用~D就可以了。
但是实际上输出的结果是
D dtor
B dtor
为什么还会调用B dtor呢? 我对于虚析构函数的理解不对?
------解决思路----------------------
因为d包括b,所以析构先调d后调b 。
------解决思路----------------------
D继承于B, 当然D对象算是B, 所以要调用B的析构函数, 不管是不是虚的.
假设B里面在析构函数里面释放点东西, D又只是析构D自己, 不久内存泄漏了.
就和D构造函数会调用B的构造函数一样.
------解决思路----------------------
虚析构的函数保证析构是一定会从子类开始析构。
子类析构时,会依次调用子类析构函数(~D),类成员变量析构函数,基类析构函数(~B)。
struct B{
virtual ~B(){cout<<"B dtor"<<endl;}
};
struct D:B{
~D(){cout<<"D dtor"<<endl;}
};
int main(){
B* pb=new D();
delete pb;
return 0;
}
我期待的结果是,既然D的析构已经是虚函数了,那么delete pb的时候,就只调用~D就可以了。
但是实际上输出的结果是
D dtor
B dtor
为什么还会调用B dtor呢? 我对于虚析构函数的理解不对?
------解决思路----------------------
因为d包括b,所以析构先调d后调b 。
------解决思路----------------------
D继承于B, 当然D对象算是B, 所以要调用B的析构函数, 不管是不是虚的.
假设B里面在析构函数里面释放点东西, D又只是析构D自己, 不久内存泄漏了.
就和D构造函数会调用B的构造函数一样.
------解决思路----------------------
虚析构的函数保证析构是一定会从子类开始析构。
子类析构时,会依次调用子类析构函数(~D),类成员变量析构函数,基类析构函数(~B)。