构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。
不建议在构造函数和析构函数里面调用虚函数。
构造函数不能声明为虚函数的原因是:
解释一:所谓虚函数就是多态情况下只执行一个。而从继承的概念来讲,总是要先构
造父类对象,然后才能是子类对象。如果构造函数设为虚函数,那么当你在构造父类
的构造函数时就不得不显式的调用构造。还有一个原因就是为了防错,试想如果你在
子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被
覆盖,也即不能完成父类的构造.就会出错。
解释二:虚函数的主要意义在于被派生类继承从而产生多态。派生类的构造函数中,
编译器会加入构造基类的代码,如果基类的构造函数用到参数,则派生类在其构造函
数的初始化列表中必须为基类给出参数,就是这个原因。虚函数的意思就是开启动态
绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时
候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不
能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之
前,这个对象根本就不存在,它怎么动态绑定?)