2011-02-07 38 views
1

说我有以下几点:如果调用非虚拟实现,将通过vtable调用函数吗?

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

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

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

将调用回调通过虚函数表或直接调用函数调用,因为它是未标记为函数签名虚拟?

+0

为什么static_cast? – 2011-02-07 19:41:17

回答

4

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

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

+0

更新为从基地派生。 – Graeme 2011-02-07 18:11:24