构造函数、拷贝构造函数、静态成员函数 等都不能是虚函数,但是析构函数可以是虚函数。
作用:
用来指引delete关键字,正确回收空间。
#include <iostream>
using namespace std;
class Parent{
private:
int *p;
public:
Parent(int value):p(new int(value)){
cout<<"Parent 有参构造"<<endl;
}
virtual ~Parent(){//虚析构函数
cout<<"Parent 析构函数"<<endl;
delete p;
}
};
class Son:public Parent{
private:
int *q;
public:
Son(int value1,int value2):Parent(value1),q(new int(value2)){
cout<<"Son 有参构造"<<endl;
}
~Son(){
cout<<"Son 析构函数"<<endl;
delete q;
}
};
int main(int argc, const char *argv[])
{
Parent *father = new Son(100,200);
//基类指针指向子类对象时,如果析构函数不是虚函数
//那么只会调用基类的析构函数,可能会造成内存泄露
//如果基类的析构函数是虚函数
//则会调用子类的析构函数,子类的析构函数会默认调用基类的析构函数,不会内存泄漏
delete father;
return 0;
}