为什么析构函数最好是虚函数?

来源:互联网 发布:telnet ip 端口号 编辑:程序博客网 时间:2024/06/04 20:26

为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。

直接上源代码来说明:

 

class Base{public: Base() { printf("B,"); } virtual ~Base() { printf("~B,"); }};class Derived : public Base{public: Derived() { printf("D,"); } virtual ~Derived() { printf("~D,"); } };


 

尽管~Derived与~Base拼写有误,但只要~Base指明virtual,~Derived中的该关键字可缺省,

所以,只需基础的析构函数声明为virtual即可,当然继承类再指定一下更明确放心。

 

(1)当指针类型与实例类型不一致时,就看出问题:

 Base *d = new Derived(); delete d; //注意此处:父类指针,指向子类实例
有virtual时,输出为:B,D,~D,~B,

无virtual时,输出为:B,D,~B, 问题就在这里:此时继承类的析构函数(释放内存、收尾处理等操作)没有被调用!

 

Derived *d = new Base(); delete d; //不安全用法,仅为测试

有virtual时输出:B,~B,

无virtual时输出:B,~D,~B,

 

(2)当指针类型与实例类型一致时,体现不出问题:

Base *d = new Base(); delete d;

无论是否有virtual,输出都为:B,~B,

Derived *d = new Derived(); delete d;

无论是否有virtual,输出都是:B,D,~D,~B,

原创粉丝点击