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

为什么构造函数内部不能调用虚函数

时间:2018-07-07 20:19:06      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:rtu   void   基类   建立   初始化   修改   on()   col   虚函数   

其实也不是不能调用,调用自然是可以的,只不过构造函数中的虚函数不具有多态性,不能达到我们想要的效果。

class Base
{
public:
    Base()
    {
        Fuction();
    }
 
    virtual void Fuction()
    {
        cout << "Base::Fuction" << endl;
    }
};
 
class A : public Base
{
public:
    A()
    {
        Fuction();
    }
 
    virtual void Fuction()
    {
        cout << "A::Fuction" << endl;
    }
};
 
// 这样定义一个A的对象,会输出什么?
A a;

我们一般想让它输出   A::Fuction    A::Fuction

但其实实际输出为      Base::Fuction    A::Fuction

给出的原因是说构造基类的时候,还未初始化派生类的成员变量。而网上很多说法说是虚表未建立。

具有虚函数的类的内存结构里除了非静态变量,还有一个虚指针,指向了虚表。  网上说的虚表未建立的说法是不合适的,因为同一个类的所有实例共享了同一张虚表。确切地说,是在基类的构造函数执行的时候,虚指针对应的内存里存放的是基类虚表的地址

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

为什么构造函数内部不能调用虚函数

标签:rtu   void   基类   建立   初始化   修改   on()   col   虚函数   

原文地址:https://www.cnblogs.com/mini-coconut/p/9277889.html

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