Насколько я понимаю, существуют условия, при которых чисто-виртуальный метод не может быть реализован в дочернем классе, но дочерний класс может быть вызван без него, что приведет к ошибке сборки.
Я не смог имитировать это. Кто-нибудь знает, как это сделать? Я выполнил ряд поисков, но не смог ничего сделать.
Это происходит, когда виртуальная функция вызывается в конструкторе базового класса.
#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
конструктор Base::Base
завершается, объект затем становится Derived
и запускается конструктор Derived::Derived
.