为什么基类的析构函数需要加上virtual?
c++面试基本都会问到的问题,我之前有很多次没答全,主要还是懒,忘记以后,没有手动去敲一下。这里做一个总结,纪念当初面试踩过的一些坑。
先看下面这个简单的栗子;基类析构函数没有加virtual时
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "A()" << endl;
}
~A() //基类析构函数没有加virtual
{
cout << "~A()" << endl;
}
virtual void func(){
cout << "hello A" << endl;
}
private:
};
class B:public A
{
public:
B()
{
cout << "B()" << endl;
}
~B()
{
cout << "~B()" << endl;
}
void func(){
cout << "hello B" << endl;
}
private:
};
int main()
{
A *a = new A;
B *b=new B;
a->func(); //输出hello A
a = b;
a->func(); //输出hello B
delete a;
return 0;
}
输出:
基类析构函数加上virtual时,输出
加上vritual后,可以看到,派生类的析构函数也被执行了。
由此得出结论,基类析构函数加上virtual的目的,是为了当基类指针指向子类对象后,当释放基类指针时,子类的对象也能被释放,从而避免内存泄漏。