[英]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()
。 这是一个递归过程,因此最终得到的是按顺序执行A
, B
和C
的构造函数。
C ++中类型的构造函数将更改虚拟方法表以指向其定义的虚拟方法/覆盖的版本。 因此
A::A()
会将getSomeParticularInfo
的条目设置为A::getSomeParticularInfo
B::B()
会将getSomeParticularInfo
的条目设置为B::getSomeParticularInfo
在点C::C()
已运行时, A
和B
的构造函数均已按该顺序运行。 因此,任何对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.