Большинство книг по объектно-ориентированному программированию, которые я читал, использовали либо класс 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() вернуть имя файла, которое он хочет воспроизвести, и позволить другой части программы справиться с этим?