我不能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();
}
答案 0 :(得分:5)
为了理解这一点,你需要在这里理解构造函数的顺序。在执行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
注意:通常我会避免在构造函数中使用虚方法。一般来说,这是一种不好的做法,因为它可能造成混淆。
答案 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
。
上面代码段的唯一问题是你不应该从构造函数中调用虚方法。