构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数
析构函数可以是虚的。虚析构函数用于指引 delete 运算符正确析构动态对象
class Animal
{
public:
Animal()
{
cout << "Animal: 构造函数" << endl;
}
virtual void Call()
{
cout << "Animal: Call" << endl;
}
virtual ~Animal()
{
cout << "Animal:析构函数" << endl;
}
};
class Cat:public Animal
{
public:
Cat()
{
cout << "Cat: 构造函数" << endl;
}
virtual void Call()
{
cout << "Cat: Call" << endl;
}
virtual ~Cat()
{
cout << "Cat:析构函数" << endl;
}
};
void PlayObj()
{
Animal *al = new Cat();
al->Call();
delete al;
}
int main()
{
PlayObj();
system("pause");
return 0;
}
执行结果:
没有定义为虚析构函数:这种问题很危险,造成内存泄漏。这就是虚析构函数的作用。
虚析构函数用于指引 delete 运算符正确析构动态对象
在继承中,使用父类对派生类对象操作时,编译器会给类添加一个虚函数表,里面来存放虚函数指针,如果基类的析构函数不是虚的,就会造成内存泄漏,具体表现为父类的内存被释放了,而子类的没有。
定义为虚析构函数: