如果基类的析构函数不是虚函数,那么在new出来对象,最后delete回收的时候调用析构函数的原则:
析构函数看指针是什么类型的,就调用那个类的析构函数,然后按继承的顺序,依次来调用父类的析构;
主要看delete 后面跟的指针是什么类型的!!!!
#include <iostream>
using namespace std;
class A
{
public:
int num;
A()
{
num=100;
cout<<"A"<<endl;
}
~A()
{
cout<<"~A"<<endl;
}
};
class B:public A
{
public:
int number;
B()
{
number=222;
cout<<"B"<<endl;
}
~B()
{
cout<<"~B"<<endl;
}
};
class C
{
public:
C()
{
cout<<"C"<<endl;
}
~C()
{
cout<<"~C"<<endl;
}
};
class D:public C
{
public:
D()
{
cout<<"D"<<endl;
}
~D()
{
cout<<"~D"<<endl;
}
};
int main()
{
B *b=new B;
delete b; //AB ~B~A
A *a=new B;
delete a; //AB~A
int *p=NULL;
A *a1=new B;
p= &(((B*)a1)->number);
delete ( D*)a1;
cout<<*p<<endl; //是乱码,证明a1的空间,确实删除了!!
//若a1是(D*)类型的,和new B没有半点儿关系,但是因为delete的a1是(D*)
//类型的,所以其调用析构函数的顺序为:AB~D~C,但是B 的空间删除了;
//这里我们可以输出B类中的number的值已经验证了;
system("pause");
return 0;
}