继承和虚拟成员函数

MWr*_*ght 0 c++

我不是100%肯定我当前设置中会出现的结果.

这可能是一个愚蠢的问题,但我看不到类似的例子.

这是示例代码

Class A {

  public:
    virtual Steer* getSomeParticularInfo(){ return m_steer; }

  private:
    Steer* m_steer:
}


Class B: A {

  public:
    virtual Steer* getSomeParticularInfo(){ return m_steer; }

  private:
    Steer* m_steer:
}

Class C: B {

  public:
    //Does not have its own getSomeParticularInfo() member function

  private:
    Steer* m_steer:
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

如果我调用getSomeParticularInfo.它会来自B类,因为它是最新的派生类还是来自基类?

//Inside Class C constructor
C::C(){
  m_steer = getSomeParticularInfo();
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 5

为了理解这一点,你需要在这里理解构造函数的顺序.在执行主体之前,C::C()执行基类型的构造函数.在这种情况下B::B().这是一个递归过程,所以你最终得到的是构造函数A,B并按C顺序执行.

C++中类型的构造函数将更改虚方法表以指向它定义的虚方法/覆盖的版本.于是

  • A::A()将设置的进入getSomeParticularInfoA::getSomeParticularInfo
  • B::B()将设置的进入getSomeParticularInfoB::getSomeParticularInfo

此时C::C()已经运行了构造函数,AB按此顺序运行.因此,任何要求getSomeParticularInfo解决的呼吁B::getSomeParticularInfo

注意:通常我会避免在构造函数中使用虚方法.一般来说,这是一种不好的做法,因为它可能造成混乱.