Будет вызван метод производного класса.
Это происходит из-за включения vtables в классы, которые имеют виртуальные функции, и классы, которые переопределяют эти функции. (Это также называется динамической диспетчеризацией.) Вот что на самом деле происходит: создается виртуальная таблица для Base
, а виртуальная таблица создается для Derived
, потому что в классе есть только одна виртуальная таблица. Поскольку pBase
вызывает виртуальную и переопределенную функцию, вызывается указатель на виртуальную таблицу для Derived
. Назовите это d_ptr
, также известный как vpointer:
int main()
{
Base *pBase = new Derived;
pBase->d_ptr->f();
return 0;
}
Теперь d_ptr вызывает Derived::f()
, который вызывает Base::f()
, который затем смотрит на vtable, чтобы увидеть, что g()
использовать. Поскольку vpointer знает только g()
в Derived
, это то, что мы используем. Следовательно, Derived::g()
называется.