问题1:C++中构造函数中调用虚函数,能实现多态吗?
答:不能。这里主要涉及到vptr的分步初始化问题。
我们先回忆一下多态的实现原理
a.当类中定义了虚函数方法时,该类就会生成一张虚函数表,其中记录虚函数的入口地址。
b.存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)。vptr指针是存储在对象的内存空间的
然后关于vptr指针,会有一个分步初始化的问题。
比如创建子类对象 child c1;
假设child类和parent类都声明有虚函数,这个时候就会涉及到vptr指针的分步初始化。
首先,会执行父类的构造函数,此时 c1.vptr 会指向父类的虚函数表,如果此时父类构造函数中调用了一个虚函数,那么肯定就会去找父类的虚函数表,
就必然达不到多态的效果。
当父类的构造函数运行完毕,会把c1.vptr指针指向子类的虚函数表。
这个时候子类c1.vptr指针的分步初始化完成。
问题2:C++中构造函数可以为虚函数吗?
答:不能。你可以这样想,什么时候会调用构造函数?当然是创建类的对象的时候,会调用构造函数,对吧。
而构造一个类的对象的步骤,第一步,是不是需要分配一块内存(对于堆栈或者静态存储区),然后第二步就是调用构造函数。
此时,如果构造函数为虚函数,会发生什么?通过上面讲解的我们知道,