在多态的设计中,如果准备使用基类指针delete派生类对象,需将基类和派生类的析构函数声明为virtual,否则程序将无法按预期工作。
几种写法产生的运行结果如下:1、基类和派生类析构任一个为virtual,另一个非virtual,程序行为未定义,一般会产生运行时错误。2、基类和派生类析构都为非virtual,只有基类的析构被调用,派生类的析构不会被调用,一般会引起内存泄露。3、基类和派生类析构都为virtual,程序正常工作,派生类和基类的析构函数先后被调用。
#include < iostream > using namespace std; class CA ... {public: CA() ...{ cout << "CA()" << endl; } virtual ~CA() ...{//OK cout << "~CA()" << endl; } /**//* ~CA() {//ERROR cout << "~CA()" << endl; } */} ; class CB : public CA ... {public: CB() ...{ cout << "CB()" << endl; } virtual ~CB() ...{//OK cout << "~CB()" << endl; } /**//* ~CB() {//ERROR cout << "~CB()" << endl; } */} ; int _tmain( int argc, _TCHAR * argv[]) ... { CA *pa = new CB(); delete pa; return 0;}