8 :
|
};
|
|
|
9:
|
|
|
|
10:
|
c la s s T u n a:p u b lic
|
F ish
|
|
{
p u b lic :
13: v o id Swim()
{
15: cout « "Tuna swims f a s t in th e se a !" « en d l;
}
};
18:
19: c la s s C a rp :p u b lic F ish
{
vo id Swim()
{
23: cout « "Carp swims slow in th e la k e !" « en d l;
}
ЮЗак. 3626
290 ЗАНЯТИЕ 11. Полиморфизм
};
void MakeFishSwim(Fish& inputFish)
{
2 9: inputFish.Swim();
}
int main()
{
// Fish myFish; // Ошибка, нельзя создать экземпляр
абстрактного класса
Carp myLunch;
Tuna myDinner;
37:
MakeFishSwim(myLunch);
MakeFishSwim(myDinner);
return 0;
}
Результат
Carp swims slow in the lake!
Tuna swims fast in the sea!
Анализ
Сущ ественна первая (закомментированная) строка функции m ain () (строка 34). Это демонстрирует, что компилятор не позволит создать экземпляр класса F is h . Он ожи дает чего-то более конкретного, такого, как специализация класса F is h (класса Tuna, например), что имеет смысл и в реальности. Благодаря чистой виртуальной функции F i s h :: Swim (), объявленной в строке 7, оба класса, Tuna и C arp, вынуждены реализовать методы T u n a : : Swim () и C a r p : : Swim () соответственно. Строки 27 -30, где реализован метод M akeFishSw im (F ish & ), демонстрируют, что, хотя экземпляр абстрактного класса
не может быть создан, ссылку или указатель на него вполне можно использовать. Таким образом, абстрактные классы — это очень хороший способ потребовать от всех произво дных классов реализации определенных функций. Если в классе T ro u t (форель), произ водном от класса F is h , забыть реализовать метод T r o u t :: Swim (), компиляция потерпит неудачу.
ПРИМЕЧАНИЕ
Абстрактные базовые классы
(Abstract Base Class) зачастую называют просто
Классы АВС накладывают на ваш проект или программу определенные ограничения.
Использование виртуального наследования для решения проблемы ромба
На занятии 10, “Реализация наследования”, мы рассмотрели любопытный случай утко носа, который является млекопитающим, но частично и птицей, и рептилией. В этом слу чае класс утконоса P la t y p u s должен происходить от классов Mammal, B i r d и R e p t il e . Однако каждый из них, в свою очередь, происходит от более обобщенного класса, A n im a l животное), как показано на рис. 11.2.
РИС. 11.2. Схема класса утконоса, демонстрирующего множественное наследование
Так что же произойдет при создании экземпляра класса P la t y p u s ? Сколько экземпля
ров класса A n im a l получится в одном экземпляре класса P la t y p u s ? Листинг 11.7 помо
жет ответить на этот вопрос.
ЛИСТИНГ 11.7. Проверка количества экземпляров базового
-ласса Animal в одном экземпляре класса Platypus________________________________
#include
using namespace std;
Do'stlaringiz bilan baham: |