码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-11-21 22:49:38      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:main   har   com   virtual   size   分享   public   ted   argv   

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

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

标签:main   har   com   virtual   size   分享   public   ted   argv   

原文地址:http://www.cnblogs.com/dsdr/p/6087059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!