在Java,C#和D等语言中,final
或sealed
类保证是叶类(没有其他类继承的类)。这允许编译器对编译时类型为final
或sealed
的对象进行顶级devirtualize方法调用。
C ++没有final
或sealed
个关键字。有没有办法模拟其在我的继承层次结构中作为叶子的类的去虚拟化的行为?
答案 0 :(得分:5)
C ++ 11确实有final
,虽然它是特殊标识符,而不是关键字。它不符合“虚拟化”的目的。它只是防止派生类派生类或单个方法在派生类中被覆盖。
答案 1 :(得分:0)
在C ++中执行此类操作的唯一方法是确保编译器知道静态和动态类型是相同的,并让优化器实现不需要虚拟调用。换句话说,按值访问对象,而不是通过引用或指针访问。这甚至适用于非 -leaf类型!