Большинство книг по объектно-ориентированному программированию, которые я читал, использовали либо класс Shape
с функцией члена Shape.draw()
, либо класс Dog
с функцией члена Dog.talk()
или что-то подобное, чтобы продемонстрировать концепция полиморфизма. Теперь это было источником путаницы для меня, которая не имеет ничего общего с полиморфизмом.
class Dog : public Animal
{
public:
...
virtual void talk() { cout << "bark! bark!" << endl; }
...
};
Хотя это может работать как простой пример, я просто не могу представить себе хороший способ сделать эту работу более сложным приложением, где Dog.talk() может нуждаться в доступе к звуковым подпрограммам другого класса, например. для воспроизведения bark.mp3
вместо использования cout
для вывода. Скажем, у меня есть:
class Audio
{
public:
...
void playMP3(const string& filename)
...
};
Что было бы хорошим способом получить доступ к Audio.playMP3()
из Dog.talk() во время разработки? Сделать Audio.playMP3()
статическим? Пропустить функции указателей функций? Have Dog.talk()
вернуть имя файла, которое он хочет воспроизвести, и позволить другой части программы справиться с этим?