说我有以下内容:
struct Base
{
virtual void callback() { /* */ }
};
struct Derived : public Base
{
void callback() { /* */ }
};
Base* obj = new Derived;
static_cast<Derived*>(obj)->callback();
对回调的调用会通过vtable调用还是直接函数调用,因为它在函数签名中没有标记为虚拟?
答案 0 :(得分:4)
Derived::callback
隐含virtual
,因为具有相同返回类型和参数的Base::callback
函数声明为virtual
。
也就是说,是否使用vtable取决于编译器及其执行的优化。由于编译器可以在此知道obj
指向Derived
对象,因此它知道callback
虚函数的最终覆盖是什么,因此它可能会在不查找的情况下进行调用在vtable中的功能。但是否这样做取决于编译器和优化设置。