为什么构造函数中调用的虚函数不具有多态性?

effective c++ 的item9中提到,不要在构造函数中调用虚函数,因为此时的虚函数不具有多态性。  给出的原因是说构造基类的时候,还未初始化派生类的成员变量。而网上很多说法说是虚表未建立。

其实,结合类的内存模型,再稍加分析,很容易可以找出更具体的原因。具有虚函数的类的内存结构里除了非静态变量,还有一个虚指针,指向了虚表。  网上说的虚表为建立的说法是不合适的,因为同一个类的所有实例共享了同一张虚表。确切地说,是在基类的构造函数执行的时候,虚指针对应的内存里存放的是基类虚表的地址。

c++ primer中明确指明,类的成员变量的初始化是完成在构造函数被调用后、构造函数函数体重的代码执行之前的。对于具有虚函数的类,虚指针也是在这个用户代码执行之前完成的。因此,执行基类的构造函数时,虚指针指向了基类的虚表;只有当执行派生类的构造函数时,虚指针的那一块内存单元的值又被修改为了派生类的虚表。

你可能感兴趣的:(c++底层实现分析)