#include <iostream.h>
class Base
{
public:
Base(){
cout<<"Base Constructor"<<endl;
}
~Base(){
cout<<"Base Destructor"<<endl;
}
public:
virtual void DoSomething(){
cout<<"Base DoSomething"<<endl;
}
};
class Derived:public Base
{
public:
Derived(){
cout<<"Derived Constructor"<<endl;
}
~Derived(){
cout<<"Derived Destructor"<<endl;
}
public:
void DoSomething(){
cout<<"Derived DoSomething"<<endl;
}
};
int main()
{
Base *p1 = new Base;
p1->DoSomething();
delete p1;
cout<<endl;
Base *p2 = new Derived;
p2->DoSomething();
delete p2;
cout<<endl;
Derived *p3 = new Derived;
p3->DoSomething();
delete p3;
return 0;
}
在Base类的析构函数没有virtual的情况上,上述代码中结果为
Base *p1 = new Base
Base Constructor
Base DoSomething
Base Destructor
Base *p2 = new Derived
Base Constructor
Derived Constructor
Derived DoSomething//这里本意图应该有Derived Destructor,没有执行Derived类的析构函数
Base Destructor
Derived *p3 = new Derived
Base Constructor
Derived Constructor
Derived DoSomething
Derived Destructor
Base Destructor
在Base类的析构函数加了virtual的情况上,上述代码中结果为
Base *p1 = new Base
Base Constructor
Base DoSomething
Base Destructor
Base *p2 = new Derived
Base Constructor
Derived Constructor
Derived DoSomething
Derived Destructor//这里执行了Derived类的析构函数
Base Destructor
Derived *p3 = new Derived
Base Constructor
Derived Constructor
Derived DoSomething
Derived Destructor
Base Destructor
总结:很明显,当把一个类作为基类的时候,用基类的指针指向派生类的地址,通过基类的指针来调用其成员函数时,应该把基类析构函数定义为virtual,这样派生类的析构函数就会执行