首页 > 代码库 > [转载]虚函数在构造函数中,已经失去了虚函数的动态绑定特性

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

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因此虚函数在构造函数中,已经失去了虚函数的动态绑定特性。

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