【问题标题】:Will function dispatch via vtable if calling non-virtual implementation?如果调用非虚拟实现,函数会通过 vtable 调度吗?
【发布时间】:2011-02-07 18:08:28
【问题描述】:

假设我有以下内容:

struct Base
{
    virtual void callback() { /* */ }
};

struct Derived : public Base
{
    void callback() { /* */ }
};

Base* obj = new Derived;
static_cast<Derived*>(obj)->callback();

回调调用是通过 vtable 调用还是直接调用函数调用,因为它在函数签名中未标记为虚拟?

【问题讨论】:

    标签: c++ class polymorphism virtual-functions dynamic-dispatch


    【解决方案1】:

    Derived::callback 隐含为virtual,因为具有相同返回类型和参数的Base::callback 函数被声明为virtual

    也就是说,是否使用 vtable 取决于编译器及其执行的优化。由于编译器在这里可以知道obj 指向Derived 对象,因此它知道callback 虚函数的最终覆盖器是什么,因此它可以在不查找vtable 中的函数的情况下进行调用。不过,是否这样做取决于编译器和优化设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-02
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2021-01-10
      • 2015-12-15
      相关资源
      最近更新 更多