博客名:飞空静渡
为什么要把父类的虚构函数声明为虚的?
这里先看几个测试,大家就应该明白了!
首先这样:
test.h
main.cpp
编译运行,结果:
parent!
child!
~child!
~parent!
我们看到程序运行正常。
其次,把main.cpp改成这样:
编译运行,结果:
parent!
child!
~parent!
我们看到,只执行了父类的虚构函数,子类的虚构函数没有执行,有很大的危险性!
最后,我们再改一下test.h,给父类的虚构函数声明为虚的!如下:
编译运行,结果:
parent!
child!
~child!
~parent!
程序运行正确!
为什么呢,懒得解释了,贴上《effective c++》里的解释吧:
c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象 ,而基类又没有虚析构函数时,结果将是不可确定的。这意味着编译器生成的 代码将会做任何它喜欢的事:重新格式化你的硬盘,给你的老板发电子邮件,把你的程序源代码传真给你的对手,无论什么事都可能发生。(实际运行时经常发生的 是,派生类的析构函数永远不会被调用。)
看到了红色的字吗,是通过基类的指针删除派生类的对象时需要定义基类的虚构函数为虚的,这个在多态时用得很频繁!