为什么要把父类的虚构函数声明为虚的

博客名:飞空静渡

 

为什么要把父类的虚构函数声明为虚的?

 

这里先看几个测试,大家就应该明白了!

 

首先这样:

test.h

 

 

 

main.cpp

 

 

编译运行,结果:

parent!
child!
~child!
~parent!

 

我们看到程序运行正常。

 

其次,把main.cpp改成这样:

 

编译运行,结果:

parent!
child!
~parent!

 

我们看到,只执行了父类的虚构函数,子类的虚构函数没有执行,有很大的危险性!

 

最后,我们再改一下test.h,给父类的虚构函数声明为虚的!如下:

 

 

编译运行,结果:

parent!
child!
~child!
~parent!

 

程序运行正确!

 

为什么呢,懒得解释了,贴上《effective c++》里的解释吧:

c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象 ,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的 代码将会做任何它喜欢的事:重新格式化你的硬盘,给你的老板发电子邮件,把你的程序源代码传真给你的对手,无论什么事都可能发生。(实际运行时经常发生的 是,派生类的析构函数永远不会被调用。)

 

看到了红色的字吗,是通过基类的指针删除派生类的对象时需要定义基类的虚构函数为虚的,这个在多态时用得很频繁!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值