继承和虚拟成员函数

时间:2012-01-03 17:16:04

标签: 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:
}

我的问题:

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:1)

它会调用B::getSomeParticularInfo()

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

答案 2 :(得分:1)

除非你明确地从A中调用它,否则它将是来自B的m_steer:

A::getSomeParticularInfo()

答案 3 :(得分:0)

是。如果您从C拨打getSomeParticularInfo(),它将是来自B的m_steer

上面代码段的唯一问题是你不应该从构造函数中调用虚方法。