【C++基础 08】virtual析构函数的作用
在面向对象语言中,接口的多种不同的实现方式即为多态。c++可以使用virtual来实现多态。
如果不使用virtual的话,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态编联(也就是迟后绑定,运行的时候才确定调用哪个对象)。
关于virtual的用法比较简单,不再复述,我们这次来看看virtual析构函数的作用。
1.示例
我们先来看一段代码:
class A { public: ~A() { cout<<"~A()"; } }; class A1 : public A{ public: ~A1() { cout<<"~A1()"; } }; void main() { A* a = new A1();//基类指针接受子类对象 delete a; return; }咋一看好像没什么问题,但运行一下你会发现输出的结果是~A()。
也就是说只析构了基类的对象,没有释放子类的对象,造成局部销毁这种诡异的资源泄漏问题。
消除这种问题的做法也很简单,给基类添加一个virtual析构函数,此后删除子类就会销毁整个对象。
2.实现:
class A { public: virtual ~A() { cout<<"~A()"; } }; class A1 : public A{ public: ~A1() { cout<<"~A1()"; } }; void main() { A* a = new A1(); delete a; return; }加上virutal关键字后,运行结果:先是子类的析构~A1() 然后是基类的析构~A()。整个对象被销毁,不存在局部销毁问题。
一个比较好的判断方式是:如果你的基类(base classes)设计是为了多态用途,那么它应该声明一个virtual析构函数,如果classes带有任何virtual函数,那么它也应该有一个virtual析构函数。