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? –

ответ

4

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

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

+0

Обновлено для получения базы. – Graeme

 Смежные вопросы

  • Нет связанных вопросов^_^