如果我执行以下操作:
class Derived : public virtual Base {};
但是Base
对于同一个后代来说,绝不会发生两次,那还需要付出代价吗?换句话说,简单地添加关键字是否会为的Base
和的子类之间的任何虚函数调用引入额外的间接级别Derived
?还是Base
从触发它的后代类的角度来看,是出现两次还是多次?
措辞有点难...我希望我的问题是有道理的。
如果Derived
是,final
则编译器可以取消继承Base
;然而,也不能保证它会和平台ABI可以防止其这样做。
如果Derived
不是final
,则编译器必须预期aDerived
可能是具有另一个对象的完整对象的子对象Base
:
class MoreDerived : public virtual Base, public Derived {};
编译器还可能能够devirtualize继承Derived
自Base
链接时优化期间,如果它可以观察到,Derived
从来不是一种子对象; 但同样,不能保证会这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句