考虑这个简单的例子:
class Base {
virtual void foo() {};
};
class Derived: public Base {
void foo() {};
};
Base *b = new Derived;
Derived *d = new Derived;
b->foo();
d->foo();
我的问题是:通过派生类指针调用在基类(但不是派生类)中声明为虚拟的成员函数是否使用(并为此付出代价)vtable 机制?在示例中,b->foo()
使用 vtable 机制调用 Derived::foo()
,但是 d->foo()
?
如果是,如何规避这种行为:当显式使用 Derived
指针时,我想直接调用 Derived::foo()
方法而不支付成本vtable,就好像基类不存在一样?
最佳答案
语法
d->Derived::foo();
将抑制虚拟调度并保证函数 Derived::foo
是被调用的函数,即使存在覆盖函数也是如此。
这很少是您想要的,但我不能建议替代解决方案,除非您解释为什么要尝试这样做。例如,在给定的代码片段中,根本没有理由要动态分配 Derived
。你可以这样写:
Derived d;
d.foo();
在这里,编译器肯定知道动态类型是Derived
,因此不需要虚拟分派(dispatch)。
关于c++ - 从派生指针调用虚函数而不支付 vtable 价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46485477/