c++ - 基类的 Virtual-and-final 函数成本(vtable/virtual-cost)

标签 c++ final virtual-functions

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.3clang 4.0添加指向 vtable 的指针。

这意味着管理普通虚函数的规则适用于在基类中标记为 virtual 和 final 的函数。因此,Base 类的大小会增加,并且当您通过指向 Base 类或派生自的某个类的指针/引用调用 fooBase,您需要为通过 vtable 重定向支付一些额外费用。

关于c++ - 基类的 Virtual-and-final 函数成本(vtable/virtual-cost),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884487/

相关文章:

c++ - 可以在 OpenCV 中隐藏 cv 前缀的函数吗?

python - boost .Python : inheret from C++ object in python: Cannot add to C++ base class list

c++ - Qt4 Designer 使用 QTableWidget 创建对话框

Java 可见性 : final static non-threadsafe collection changes after construction

Java:对枚举数组的最终引用是不可变的吗?

java - 我可以使用同步到最终字段吗?

c++ - 从构造函数调用虚函数

c++ - 检测派生类中是否已重新定义 C++ 虚函数的方法

c++ - 子类的类友元

c++ - 如何伪造包含非虚函数的 C++ 类?