1

说我有以下内容:

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

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

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

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

4

1 回答 1

4

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

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

于 2011-02-07T18:10:17.540 回答