繁体   English   中英

继承和虚拟成员函数

[英]Inheritance and virtual member functions

我不确定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:
}

我的问题:

如果我打电话给getSomeParticularInfo。 它是来自B类,因为它是最新的派生类,还是来自基类?

//Inside Class C constructor
C::C(){
  m_steer = getSomeParticularInfo();
}

为了理解这一点,您需要在这里了解构造函数的顺序。 在执行C::C()的主体之前,必须执行基本类型的构造函数。 在这种情况下B::B() 这是一个递归过程,因此最终得到的是按顺序执行ABC的构造函数。

C ++中类型的构造函数将更改虚拟方法表以指向其定义的虚拟方法/覆盖的版本。 因此

  • A::A()会将getSomeParticularInfo的条目设置为A::getSomeParticularInfo
  • B::B()会将getSomeParticularInfo的条目设置为B::getSomeParticularInfo

在点C::C()已运行时, AB的构造函数均已按该顺序运行。 因此,任何对getSomeParticularInfo调用getSomeParticularInfo将解析为B::getSomeParticularInfo

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

它将调用B::getSomeParticularInfo()

而且,该函数在编译时会故意忽略A::m_steer并且不会意识到C::m_steer的存在。

除非您从A显式调用它,否则它将是B的m_steer:

A::getSomeParticularInfo()

是。 如果从C调用getSomeParticularInfo() ,则它将是B的m_steer

以上代码段的唯一问题是,您不应从构造函数中调用虚拟方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM