Вы забываете одну очень важную вещь, когда дело доходит до полиморфизма и переопределения функций базового класса: функции должны быть virtual
.
Поскольку ваша функция не virtual
, вы вызываете функцию Base::hello
, и, поскольку она ничего не возвращает, у вас будет неопределенное поведение , приводя к аварии, которую вы испытываете.
Вы можете попросить компилятор помочь вам обнаружить такие случаи, используя спецификатор override
:
class InheritedA : public Base{
friend class Base;
public:
string hello() override // Tell the compiler that this function should
// override the function from the parent class
{return "I am iA";}
protected:
InheritedA() {};
};
Если вы используете спецификатор override
, компилятор выдаст ошибку, если функция не virtual
.
Помимо маркировки функции базового класса virtual
, вам действительно нужно либо вернуть что-то, что-нибудь из функции, либо сделать ее абстрактной:
class Base {
public:
static shared_ptr<Base> factory();
// Make the function a pure abstract function that must be overridden
virtual string hello() = 0;
virtual ~Base() {};
protected:
Base(){};
};