对于构造函数不能为虚函数的原因,查了挺多资料,总结出以下三个比较易理解并且比较靠谱的原因:
- 原因一
- 虚函数的意思就是开启动态绑定,程序会根据对象的动态类型(基类还是子类)来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,压根就没有办法确定它到底是什么类型,故构造函数不能动态绑定。(动态绑定是根据对象的动态类型,在调用构造函数之前,这个对象根本就不存在,它怎么动态绑定?)
- 原因二
- 当我们创建一个对象的时候,第一步是申请需要的内存,第二步就是调用构造函数,然后在构造函数中初始化vtable和vptr。试想,如果构造函数是虚函数,那必然需要通过vtable来找到虚构造函数的入口地址,而此时我们申请的内存还没有做任何初始化,还没有vtable和vptr,就无法调用这个虚构造函数,这就造成了矛盾。因此,构造函数不能是虚函数。
- 原因三
- 虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
如果还有其他比较靠谱的原因,请各位告知,我将修改加上。