1
#include<stdio.h>
class A
{
public:
A(){ printf("A");}
~A(){ printf("~A");}
};
class B: public A
{
public:
B(){ printf("B");}
~B(){ printf("~B");}
};
int main()
{
A* c = new B[2];
delete[] c;
return 0;
}
ABAB~A~A
2
#include<stdio.h>
class A
{
public:
A(){ printf("A");}
virtual ~A(){ printf("~A");}
};
class B: public A
{
public:
B(){ printf("B");}
~B(){ printf("~B");}
};
int main()
{
A* c = new B[2];
delete[] c;
return 0;
}
ABAB~A~A
3
#include<stdio.h>
class A
{
public:
A(){ printf("A");}
~A(){ printf("~A");}
};
class B: public A
{
public:
B(){ printf("B");}
~B(){ printf("~B");}
};
int main()
{
B* c = new B[2];
delete[] c;
return 0;
}
ABAB~B~A~B~A
4
#include<stdio.h>
class A
{
public:
A(){ printf("A");}
virtual ~A(){ printf("~A");}
};
class B: public A
{
public:
B(){ printf("B");}
~B(){ printf("~B");}
};
int main()
{
B* c = new B[2];
delete[] c;
return 0;
}
ABAB~B~A~B~A
结合程序1、2可知,不管基类析构函数加不加virtual,只要是声明的是基类的指针,即使实际指向的实例是派生类的,也不会调用派生类的析构方法。
由程序3、4可知,不管基类析构函数加不加virtual,只要是声明的是派生类的指针,并且实际指向的实例是派生类的,会先调用派生类的析构方法,然后级联调用父类的析构方法。