virtual final 函数(final
在基类)是否有任何 vtable/virtual 成本?
class B{
public: virtual void fFinal() final{ .... do something ..... }
public: void fCheap() { .... do something ..... }
public: virtual void fVirtual() { .... do something ..... }
};
class C : public B{
public: virtual void fVirtual() { .... do something ..... }
};
fFinal()
的成本是否等于 fCheap()
或 fVirtual()
的成本?
我将使用 final+virtual 来防止人为错误(“不要覆盖我”)。
fCheap()
不是那么安全,因为我仍然可以隐藏父函数。
以下这些链接不提供答案。
最佳答案
据我所知,任何特定的编译器是如何实现虚函数机制的都是未指定的。如果类至少有一个虚函数,即使这个虚函数被标记为 final,他们也很有可能将指向 vtable 的指针放入类中。
我已经根据您的代码片段测试了一个简化示例:
class Base {
public:
virtual void foo() final {}
};
static_assert(sizeof(Base) > 1, "No pointer to vtable");
似乎gcc 6.3和 clang 4.0添加指向 vtable 的指针。
这意味着管理普通虚函数的规则适用于在基类中标记为 virtual 和 final 的函数。因此,Base
类的大小会增加,并且当您通过指向 Base
类或派生自的某个类的指针/引用调用 foo
时Base
,您需要为通过 vtable 重定向支付一些额外费用。
关于c++ - 基类的 Virtual-and-final 函数成本(vtable/virtual-cost),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884487/