虚函数的执行依赖于虚函数表,而虚函数表需要在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。
/*在类的继承中,如果有基类指针指向派生类
那么用基类指针delete时,如果不定义成虚函数
派生类中派生的那部分无法析构。*/
1、构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定是实际类型的。构造一个对象时,由于对象还未构造成功。编译器无法知道对象的实际类型,到底是该类本身,还是该类的一个派生类,或者更深层次的派生类,无法确定。
2、虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。
3、虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法去确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型而不是函数名,在调用构造函数之前,这个对象根本就不存在)
4、编译器在调用基类的构造函数的时候并不知道你要构造一个基类的对象还是一个派生类的对象。