虚函数在构造函数中,已经失去了虚函数的动态绑定特性

Posted 德克斯特的实验室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚函数在构造函数中,已经失去了虚函数的动态绑定特性相关的知识,希望对你有一定的参考价值。

class A
{
public:
        A()
        {
                Print();
        }
        virtual void Print()
        {
                printf("A is constructed.\\n");
        }
};
 
class B: public A
{
public:
        B()
        {
                Print();
        }
 
        virtual void Print()
        {
                printf("B is constructed.\\n");
        }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
        A* pA = new B();
        delete pA;
 
        return 0;
}

先后打印出两行:A is constructed. B is constructed. 调用B的构造函数时,先会调用B的基类及A的构造函数。然后在A的构造函数里调用Print。由于此时实例的类型B的部分还没有构造好,本质上它只是A的一个实例,他的虚函数表指针指向的是类型A的虚函数表。因此此时调用的PrintA::Print,而不是B::Print。接着调用类型B的构造函数,并调用Print。此时已经开始构造B,因此此时调用的PrintB::Print

同样是调用虚拟函数Print,我们发现在类型A的构造函数中,调用的是A::Print,在B的构造函数中,调用的是B::Print因此虚函数在构造函数中,已经失去了虚函数的动态绑定特性。

以上是关于虚函数在构造函数中,已经失去了虚函数的动态绑定特性的主要内容,如果未能解决你的问题,请参考以下文章

C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表

C++ 多态 : 虚函数静态绑定动态绑定单/多继承下的虚函数表

16. 虚函数静态绑定动态绑定

C++ 虚函数表剖析

C++ 虚函数表剖析

C++ 虚函数表剖析