生成子类对象时,先调用父类的构造函数,再调用自己的构造函数
析构时是先调用子类的析构函数,再调用父类的析构函数
之所以出现你的现象,是因为
A *a=new B();
delete a;
这种用法是不妥的,你这样做只是析构了父类对象,而并没有删除子类对象.
改为这样
A *a=new B();
delete (B*)a; 看看结果你就清楚了.
一般遇到这样的现象,需要将基类的析构函数定义为虚拟的.
#include <iostream>
using namespace std;
class A{
public:
A(){cout < <"Construct a" < <endl;p();}
virtual void p(){cout < <"A" < <endl;}
virtual ~A(){cout < <"Destruct a" < <endl;p();}
};
class B : public A{
public:
B(){cout < <"Construct b" < <endl;p();}
void p(){cout < <"B" < <endl;}
~B(){cout < <"Destruct b" < <endl;p();}
};
int main()
{
A *a=new B();
delete a;
getchar();
return 0;
}
打印的结果是:
Construct a
A
Construct b
B
Destruct b B Destruct a A
|