2012-01-03 103 views
0

我不是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(); 
} 
+2

它将来自类'B'。 – dasblinkenlight 2012-01-03 17:18:15

+2

但是让我告诉你,[这个代码味道](http://en.wikipedia.org/wiki/Code_smell)。 – 2012-01-03 17:22:16

回答

5

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

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

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

入口在C::C()已经运行两个构造为AB已经在运行点该订单。因此任何呼叫getSomeParticularInfo将解析为B::getSomeParticularInfo

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

0

是的。如果你从C调用getSomeParticularInfo()它将是来自B的m_steer

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

1

它将调用B::getSomeParticularInfo()

这功能,编译会故意忽略A::m_steer并不会意识到C::m_steer存在。

1

这将是的B m_steer除非你明确地从A喜欢叫它:

A::getSomeParticularInfo()