Я думаю, что ваша проблема не в реализации как таковой (проверка фактического класса была бы возможна с использованием dynamic_cast
, но я не буду вдаваться в подробности здесь, так как это не нужно), а скорее в ваше понимание ориентации объекта впервое место - по крайней мере, в этом конкретном примере.
Принцип замены Лискова *1005* гласит, что "если S является подтипом T, то объекты типа T могут быть заменены объектамитипа S (т.е. объект типа T может быть заменен любым объектом подтипа S). " Здесь это не так.
Вместо определения cout_xyz
в ваших подклассах, выследует написать void cout_fruit()
как абстрактный метод в class Fruit
и переопределить его в подклассах.
class Fruit { public: virtual void cout_fruit() = 0; };
class Banana: public Fruit { public: void cout_fruit() override { cout << "i am a banana" << endl; } };
class Apple : public Fruit { public: void cout_fruit() override { cout << "i am an apple" << endl; } };
// [...]
Тогда для каждого фрукта вы можете просто вызвать f->cout_fruit()
.