jan*_*195 1 c++ polymorphism performance vtable
考虑这个简单的例子:
class Base {
virtual void foo() {};
};
class Derived: public Base {
void foo() {};
};
Base *b = new Derived;
Derived *d = new Derived;
b->foo();
d->foo();
Run Code Online (Sandbox Code Playgroud)
我的问题是:通过派生类指针调用在基类(但不在派生类中)中声明为虚拟的成员函数是否使用vtable机制(并付出代价)?在示例中b->foo()使用vtable机制来调用Derived::foo(),但是d->foo()?
如果是,那么如何规避这种行为:当明确使用Derived指针时,我想直接调用该Derived::foo()方法而不支付vtable的成本,就像基类不存在一样?
语法
d->Derived::foo();
Run Code Online (Sandbox Code Playgroud)
将禁止虚拟调度并保证该函数Derived::foo是被调用的函数,即使存在重写函数.
这很少是你想要的,但我不能建议其他解决方案,除非你解释为什么你要这样做.例如,在给出的代码片段中,没有理由Derived应该动态分配.你可以写这个:
Derived d;
d.foo();
Run Code Online (Sandbox Code Playgroud)
在这里,编译器确定动态类型是Derived,因此不需要虚拟调度.