Будет ли функция диспетчеризации через vtable при вызове не виртуальной реализации? - PullRequest
1 голос
/ 07 февраля 2011

Скажите, что у меня есть следующее:

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

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

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

Будет ли вызываться обратный вызов через vtable или прямой вызов функции, поскольку он не помечен как виртуальный в сигнатуре функции?

1 Ответ

4 голосов
/ 07 февраля 2011

Derived::callback неявно virtual, потому что функция Base::callback с тем же типом и параметрами возврата объявлена ​​как virtual.

При этом, будет ли использоваться vtable, зависит откомпилятор и какие оптимизации он выполняет.Поскольку здесь компилятор может знать, что obj указывает на объект Derived, он знает, каков окончательный переопределитель для виртуальной функции callback, поэтому он мог бы потенциально сделать вызов, не просматривая функцию в vtable.Хотя это зависит от компилятора и настроек оптимизации.

...