У меня есть две специализированные объекты:Есть ли способ, чтобы специализироваться общий метод наследуемого объекта
class Food {};
class Fruit : public Food {};
class Vegetable : public Food {};
Тогда у меня есть родительский класс, который будет наследоваться:
class Parent
{
virtual void say(Food* obj) { std::cout << "The object is food" << std::endl; }
};
И наследственное класс от родителя.
class Child : public Parent
{
virtual void say(Fruit* obj) { std::cout << "The object is a fruit" << std::endl; }
virtual void say(Vegetable* obj) { std::cout << "The object is a vegetable" << std::endl; }
};
я:
std::vector<Food*> basket;
Fruit fruit = Fruit();
Vegetable vegetable = Vegetable();
basket.push_back(&fruit);
basket.push_back(&vegetable);
Child child = Child();
for (Food* food : basket)
{
child.say(food);
}
Я хотел бы, чтобы напечатать «Объект является плодом», а затем «Объект представляет собой овощ», но он не работает: я получаю сообщение об ошибке: неизвестное преобразование для аргумента 1 из «Пища *» в «Фрукты *».
Есть ли способ сделать это, не используя typeid, если это возможно, потому что я слышал, что это накладные расходы. Вот код в онлайн-редакторе: cpp.sh/27ekc
Различные продукты должны печатать себя полиморфно. Затем вы просто вызываете эту функцию в своей функции 'say'. – NathanOliver
В реальном мире ребенок знает, что она есть. В ООП еда знает свое имя. – Arkadiy
Я думаю, проблема в том, что вы не можете вызвать перегруженный метод, ожидающий полиморфизма, чтобы выяснить, какой метод вызывать. –