Освоившись с идеей базовых классов и инкапсуляции, я начал понимать полиморфизм, но не могу понять, как заставить его работать.Многие примеры, которые я искал, выглядят как действительно, действительно принудительно (классы Foo и Bar слишком абстрактны для меня, чтобы я мог увидеть утилиту), но вот как я понимаю основную концепцию: вы пишетебазовый класс, производный от него целый набор других вещей, которые меняют то, что базовые методы делают (но не то, что они «есть»), тогда вы можете написать общие функции для принятия и обработки любого из производныхклассы, потому что вы несколько стандартизировали их внешний вид.Исходя из этой предпосылки, я попытался реализовать базовую иерархию Animal-> cat / dog следующим образом:
class Animal {
public:
virtual void speak() = 0;
};
class Dog : public Animal {
public:
void speak() {cout << "Bark bark!" << endl;}
};
class Cat : public Animal {
public:
void speak() {cout << "Meow!" << endl;}
};
void speakTo(Animal animal) {
animal.speak();
}
, где имеется возможность говорить, может взять общее животное и заставить его говорить, ну, в общем, говорить.Но, насколько я понимаю, это не работает, потому что я не могу создать экземпляр Animal (в частности, в аргументе функции).Тогда я спрашиваю, понимаю ли я основную утилиту полиморфизма, и как я могу действительно делать то, что я пытался сделать?