【发布时间】:2017-01-03 08:25:43
【问题描述】:
如果我执行以下操作:
class Derived : public virtual Base {};
但是Base 永远不会在同一个后代类中出现两次,还有成本吗?换句话说,简单地添加关键字是否会为Base 和Derived 的子类之间的任何虚函数调用引入额外的间接级别?还是从触发它的后代类的角度来看,Base 的出现两次或更多次?
关于这个的措辞有点强硬......我希望我的问题是有道理的。
【问题讨论】:
-
如果 Base 有字段,每次从 Derived 访问 Base 字段都会产生成本,因为编译器需要从存储在虚拟方法表中的移位索引中找到 Base。从 Derived 到 Base 的每个演员都是这种情况。此外,从 Base 到 Derived 的每次转换都是
dynamic_cast,这比static_cast更昂贵。 -
@Franck 即使您直接使用
Derived实例也是如此吗? IE。没有奇怪的钻石继承。 -
是的,因为 Derived 类无法知道未来的 Derived2 类(在另一个翻译单元中)是否不会创建钻石。在这种情况下,从 Derived* 到 Base* 的转变会有所不同。
标签: c++