Это происходит, когда виртуальная функция вызывается в конструкторе базового класса.
#include <iostream>
class Base
{
public:
Base() { g();}
virtual ~Base() {}
void g() { f(); }
virtual void f() = 0;
};
class Derived : public Base
{
public:
Derived() : Base() {}
~Derived() {}
void f() { std::cout << "Derived f()" << std::endl; }
};
int main()
{
Derived d; // here we have the call to the pure virtual function
return 0;
}
РЕДАКТИРОВАТЬ:
Основной проблемой является: когда Derived
объект построен, объект начинается как Base
, то конструктор Base::Base
выполняется. Поскольку объект по-прежнему Base
, вызов f()
(через g()
) вызывает Base::f
, а не Derived::f
. После завершения конструктора Base::Base
объект затем становится Derived
и запускается конструктор Derived::Derived
.
Не правда ли, чтобы вызвать виртуальные функции внутри конструктора? – Pradheep
@ Pradheep Конечно, это нет. Но вышеприведенный пример является неправильным. –
@ Pradheep - нет ничего плохого в вызове виртуальных функций внутри конструктора (или деструктора). «Правило», что это плохая идея, исходит от людей, которые не понимают, как работает такой звонок. Он вызывает версию, определенную для типа, чей конструктор (или деструктор) в настоящий момент запущен, что не обязательно является самым производным типом. –