转载:
析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。
1 #include2 #include 3 4 class CPerson 5 { 6 public: 7 virtual ~CPerson(); //基类的析构函数必须声明为虚函数,否则 8 9 用delete销毁对象时会出错10 protected:11 char * m_lpszName;12 char * m_lpszSex;13 };14 15 class CStudent:public CPerson16 {17 public:18 ~CStudent(); //virtual可加也可不加19 protected:20 int m_iNumjber; //学号21 };22 23 CPerson::~CPerson()24 {25 cout<<"~CPerson!"<
输出:
~Student!
~CPerson!
CStudent对象已经完成析构
~Student!
~CPerson!
如果去掉~CPerson()前面的virtual,且将“CStudent对象已经完成析构”改为“CStudent对象未完成析构”。程序的执行结果为:
~CPerson!
CStudent对象未完成析构
~Student!
~CPerson!