#include<iostream>
#include<memory>
using namespace std;
class A
{
public:
A(){
cout<<"A: cons"<<endl;
}
virtual ~A(){
cout<<"A: des"<<endl;
}
virtual void print(){
cout<<"A: print"<<endl;
}
};
class AA:public A
{
public:
AA(){
cout<<"AA: cons"<<endl;
}
virtual ~AA(){
cout<<"AA: des"<<endl;
}
virtual void print(){
cout<<"AA: print"<<endl;
}
};
int main(int argc,char* argv[])
{
A* a_p = new AA(); //指向派生类的基类指针,实现多态
a_p->print();
delete(a_pp); //若基类析构非virtual,则仅仅析构基类部分
A aa; //无论基类析构是否virtual,程序结束时基类、派生类都将被析构。因为是栈上自动回收,aa同时包含AA和A的部分。
return 0;
}
为多态基类声明virtual析构函数
否则,通过基类指针去delete,只能析构基类而派生类没有被回收。
因为基类的析构函数没有多态特性,只会析构基类而已。
一味将析构指定为virtual或非virtual都是不对的。
一般,带有virtual成员函数的类可被认为是多态基类,声明其析构为virtual。
为啥base类的virtual析构函数和derived类的析构函数名称不一样,却可以实现多态?
可认为析构函数不是命名为~className(),而是~。
参见:点击打开链接