Для решения возникшей проблемы можно использовать несколько подходов. Haпример, можно переименовать слишком "лошадиный" метод Gallop в более обтекаемый Move, после чего заместить этот метод в объекте Pegasus таким образом, чтобы он выполнял функцию метода Fly. В других объектах класса Horse метод Move будет выполняться так же, как раньше выполнялся метод Gallop. Для объекта Pegasus можно даже определить, что короткие дистанции он должен преодолевать методом Gallop, а длинные — методом Fly:
Pegasus::Move(long distance)
{
if (distance > veryFar)
fly(distance);
else
gallop(distance);
}
Но и этот подход имеет ряд ограничений, поскольку объект уже не сможет летать на короткие дистанции и бегать на длинные. Может быть, все же просто перенести метод Fly в класс Horse, как показано в листинге 13.1? Проблема состоит в том, что лошади, в большинстве своем, летать не умеют, поэтому во всех объектах этого класса, за исключением объекта Pegasus, данный метод не должен ничего выполнять.
Листинг 13.1. Умеют ли лошади летать...
1: // Листинг 13.1. Умеют ли лошади летать...
2: // Фильтрация метода Fly в классе Horse
3:
4: #include
5:
6: class Horse
7: {
8: public:
9: void Gallop{ cout << "Galloping...\n"; }
10: virtual void Fly { cout << "Horses can't fly.\n"; }
11: private:
12: int itsAge;
13: };
14:
15: class Pegasus : public Horse
16: {
17: public:
18: virtual void Fly { cout << "I can fly! I can fly! I can fly!\n"; }
19: };
20:
21: const int NumberHorses = 5;
22: int main
23: {
24: Horse* Ranch[NumberHorses];
25: Horse* pHorse;
26: int choice,i;