我不是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)
为了理解这一点,你需要在这里理解构造函数的顺序.在执行主体之前,C::C()执行基类型的构造函数.在这种情况下B::B().这是一个递归过程,所以你最终得到的是构造函数A,B并按C顺序执行.
C++中类型的构造函数将更改虚方法表以指向它定义的虚方法/覆盖的版本.于是
A::A()将设置的进入getSomeParticularInfo到A::getSomeParticularInfo B::B()将设置的进入getSomeParticularInfo到B::getSomeParticularInfo此时C::C()已经运行了构造函数,A并B按此顺序运行.因此,任何要求getSomeParticularInfo解决的呼吁B::getSomeParticularInfo
注意:通常我会避免在构造函数中使用虚方法.一般来说,这是一种不好的做法,因为它可能造成混乱.