关于构造函数内调用虚函数的问题

在构造函数不要调用虚函数。在基类构造的时候,虚函数是非虚,不会走到派生类中,既是采用的静态绑定。显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。就是根据构造顺序原理。

 

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;
 

 

实际的输出结果是:

 
  1. Base::Fuction

  2. A::Fuction

利用上面的原理即可分析出结果。

参考博客

  1. c++ 构造函数里可以调用虚函数吗
  2. C++中构造函数能调用虚函数吗?

你可能感兴趣的:(c++)