如果调用非虚拟实现,函数将通过vtable调度吗?

时间:2011-02-07 18:08:29

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

说我有以下内容:

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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