C++ за 21 день седьмое издание



Download 1,38 Mb.
bet192/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   188   189   190   191   192   193   194   195   ...   437
Bog'liq
word1

#include




  1. using namespace std;



2 :

  1. class Fish




  1. {




  1. public:




  1. void Swim()




  1. {




  1. cout « "Fish swims!" « endl;




  1. }

10: };


1 1 :



  1. class Tuna:public Fish




  1. {




  1. public:




  1. // переопределение Fish::Swim




  1. void Swim()




  1. {




  1. cout << "Tuna swims!" « endl;




  1. }

20: };

Основы полиморфизма

279


  1. void MakeFishSwim(Fish& InputFish)




  1. {




  1. // вызов Fish::Swim




  1. InputFish.Swim();




  1. }



IB: int main()



  1. {




  1. Tuna myDinner;




  1. // вызов Tuna::Swim 2 3: myDinner.Swim();

j i :


  1. // передача Tuna как Fish




  1. MakeFishSwim(myDinner);



*->.



  1. return 0;




  1. }



Результат


Tuna swims!


Fish swims!


Анализ

Класс T una специализирует класс F is h через открытое наследование, как показано


з строке 12. Он также переопределяет метод F is h : :S w im () . Функция m ain () напря­


мую вызывает метод T u n a: :S w im () в строке 33 и передает объект m y D in n e r (клас­


са Tuna) как параметр для функции M akeFishSw im (), которая интерпретирует это как ссылку Fish& , как видно в ее объявлении (строка 22). Другими словами, вызов функции M akeFishSwim (Fish& ) не заботит, что был передан объект класса Tuna, он обрабатывает его как объект класса F is h и вызывает метод F i s h : : Swim (). Так, вторая строка вывода означает, что тот же объект класса Tuna создал вывод, как у класса F is h , без всякой спе­ циализации (с таким же успехом это мог быть класс C arp).


Однако пользователь, в идеале, ожидал бы, что объект класса Tuna поведет себя как ту­ нец, даже если вызван метод F i s h : : Swim (). Другими словами, когда метод I n p u t F i s h . Swim () вызывается в строке 25, он ожидает, что будет выполнен метод T u n a : : Swim (). Такое полиморфное поведение, когда объект известного класса типа F is h может вести себя как объект фактического типа, а именно производный класс Tuna, может быть реали­ зован, если сделать функцию F i s h :: Swim () виртуальной.


Полиморфное поведение, реализованное при помощи виртуальных функций

Доступ к объекту класса F is h возможен через указатель F ish * или по ссылке Fish& . Объект класса F is h может быть создан индивидуально или как часть объекта класса Tuna или C arp , производного от класса F is h . Неважно, как именно, но вы вызываете метод Swim (), используя этот указатель или ссылку:


280 ЗАНЯТИЕ 11. Полиморфизм




pFish->Swim();


myFish.Swim();

Вы ожидаете, что объект класса F is h будет плавать, как тунец, если это часть объекта класса Tuna, или как карп, если это часть объекта класса C arp, или как безымянная рыба, если объект класса F is h был создан не как часть такого специализированного класса, как Tuna или C arp . Вы можете гарантировать это, объявив функцию Swim () в базовом классе F is h как виртуальную функцию (virtual function):




class Base


virtual ReturnType FunctionName (Parameter List);

};
class Derived


{
ReturnType FunctionName (Parameter List);


};


Использование ключевого слова v i r t u a l означает, что компилятор гарантирует вызов любого переопределенного варианта затребованного метода базового класса. Таким обра­ зом, если метод Swim () объявлен как v i r t u a l , вызов m y F ish . Swim () (m yFish имеет тип Fish& ) приводит к вызову метода T u n a : : Swim (), как показано в листинге 11.2.

ЛИСТИНГ 11.2. Результат объявления метода Fish: :Swim() виртуальным________________






  1. Download 1,38 Mb.

    Do'stlaringiz bilan baham:
1   ...   188   189   190   191   192   193   194   195   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish