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


Fish(bool IsFreshWater) : FreshWaterFish(IsFreshWater){}



Download 1,38 Mb.
bet182/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   178   179   180   181   182   183   184   185   ...   437
Bog'liq
word1

Fish(bool IsFreshWater) : FreshWaterFish(IsFreshWater){}




      1. void Swim()




      1. {




      1. if (FreshWaterFish)




      1. cout « "Swims in lake" « endl;




      1. else



1": cout « "Swims in sea" « endl;
Is: }

  1. };




  1. class Tuna: public Fish

22: {



  1. public:




  1. Tuna(): Fish(false) {}




  1. };



2": class Carp: public Fish


2=: {

  1. public:




  1. Carp() : Fish(true) {}



:1: };



  1. 2: int main()



:4: {



  1. Carp myLunch;




  1. Tuna myDinner;







cout

«

"Getting my food to swim" «

endl;

*]:

cout

«

"Lunch:

";




-1:

myLunch.Swim();







-2:

cout

«

"Dinner:

";




-4:

myDinner.Swim();







*5:

// Снимите комментарий со строки 48,

чтобы убедиться в

  1. недоступности защищенных членов извне иерархии класса




  1. myLunch.FreshWaterFish = false;



:2: return 0;


-1: }

256 ЗАНЯТИЕ 10. Реализация наследования




Результат


Getting my food to swim


Lunch: Swims in lake


Dinner: Swims in sea


Анализ

Теперь у класса F is h есть конструктор, который получает заданный по умолчанию па­ раметр, инициализирующий переменную F i s h : : F re sh W a te rF ish . Таким образом, един­ ственная возможность создать объект класса F is h — это предоставить параметр, который


инициализирует защищенный член. Так, класс F is h гарантирует, что защищенный член класса не будет содержать случайного значения, если пользователь производного клас­ са забудет его установить. Теперь производные классы Tuna и C arp вынуждены опреде­ лить конструктор, создающий экземпляр базового класса F is h с правильным параметром ( t r u e или f a l s e , указывающим, пресноводная ли это рыба), как показано в строках 24 и 30 соответственно.



ПРИМЕЧАНИЕ
Как можно заметить в листинге 10.3, производный класс никогда не обращался непосредственно к логической переменной-члену Fish::FreshWaterFish, несмотря на то, что она является защищенной, поскольку ее значение было установлено конструктором класса Fish.

Чтобы гарантировать максимальную защиту, если производные классы не нуж­ даются в доступе к атрибуту базового класса, отметьте его как private.





Производный класс, переопределяющий методы базового класса

Если производный класс реализует те же функции с теми же возвращаемыми значе­ ниями и сигнатурами, что и базовый класс, от которого он происходит, то он фактически переопределяет этот метод базового класса, как показано в следующем коде:




class Base

{
public:




void DoSomething()
{
// код реализации... Делает нечто

}


class Derived:public Base


{


public:


void DoSomething()

{
// код реализации... Делает нечто другое



Основы наследования

257

Таким образом, если бы метод D oSom ething () должен быть вызван с использованием экземпляра класса D e riv e d , то это не задействовало бы функциональные возможности в классе B ase.


Если классы Tuna и C a rp должны реализовать собственный метод Sw im (), который существует также и в базовом классе как F i s h : : Swim (), то его вызов в методе m ain () так, как показано в следующем отрывке листинга 10.3,





  1. Tuna myDinner; // ... другие строки

  2. myDinner.Swim();

привел бы к выполнению локальной реализации метода T u n a : : Swim (), которая, по ущ еству, переопределяет метод F i s h : : Swim () базового класса. Это демонстрирует ли-гтинг 10.4.


ЛИСТИНГ 10.4. Производные классы Tuna и Carp, переопределяющие метод SwimQ базового класса Fish


.: #include



  1. using namespace std;




  1. class Fish

{


    1. private:




  1. bool FreshWaterFish;



3: public:



    1. // конструктор класса Fish




  1. Fish(bool IsFreshWater) : FreshWaterFish(IsFreshWater){}



.1: void Swim()



  1. {

.4: if (FreshWaterFish)



  1. cout « "Swims in lake" « endl;



.5:else


cout « "Swims in sea" « endl;



    1. }




    1. };




    1. class Tuna: public Fish




  1. {

  2. public:




  1. Tuna(): Fish(false) {}




  1. void Swim()

1": {


  1. cout « "Tuna swim^ real fast" « endl;


  1. class Carp: public Fish




  1. public:




  1. Carp(): Fish (true) {}






1 3ak. 3626

Основы наследования

259




  1. листинге 10.5 показан вызов члена базового класса с использованием экземпляра гроизводного класса.



Вызов методов базового класса в производном классе

Обычно метод F i s h : : Swim () содержал бы обобщенную реализацию плавания, при­ менимого ко всем рыбам, включая тунцов и карпов. Если специализированные реализации методов T u n a :: Swim () и C a rp : : Swim () должны использовать обобщенную реализацию метода базового класса F i s h :: Swim (), используйте оператор области видимости ( : : ) , как ю казано в следующем коде:




class Carp: public Fish

{
public:




Carp(): Fish(true) {}


void Swim()

{
cout « "Carp swims real slow" « endl;




Fish::Swim(); // использование оператора области видимости ::
Этот подход используется в листинге 10.5.

ЛИСТИНГ 10.5. Использование оператора области видимости (::) для вызова методов базового класса из методов производных классов и функции main ()


*: #include



  1. using namespace std;




  1. class Fish




  1. private:




  1. bool FreshWaterFish;



8: public:



  1. // конструктор класса Fish



.1: Fish(bool IsFreshWater) : FreshWaterFish(IsFreshWater){}


.2: void Swim()

-3: {


  1. if (FreshWaterFish)




  1. cout « "Swims in lake" « endl;




  1. else



1": cout « "Swims in sea" « endl;



  1. }

1 *: } ;



class Tuna: public Fish



  1. {




public:


Tuna(): Fish(false) {}

260 ЗАНЯТИЕ 10. Реализация наследования



  1. void Swim()




  1. {




  1. cout « "Tuna swims real fast" « endl;




  1. }




  1. };



31:



  1. class Carp: public Fish




  1. {




  1. public:




  1. Carp(): Fish(true) {}








  1. void Swim()




  1. {




  1. cout « "Carp swims real slow" << endl;




  1. Fish::Swim();




  1. }




  1. };



43:



  1. int main()




  1. {




  1. Carp myLunch;




  1. Tuna myDinner;








  1. cout « "Getting my food to swim" « endl;








  1. cout « "Lunch: ";




  1. myLunch.Swim();



53:



  1. cout « "Dinner: ";




  1. myDinner.Fish::Swim();








  1. return 0;




  1. }



Результат


Getting my food to swim


Lunch: Carp swims real slow


Swims in lake


Dinner: Swims in sea


Анализ

Метод C a rp : : Swim () в строках 37-41 демонстрирует вызов функции F i s h : : Swim () базового класса с использованием оператора области видимости ( : : Строка 55, с другой стороны, демонстрирует возможность использования оператора области видимости ( : : ) для вызова метода базового класса F i s h : : Swim () из функции m ain () с использованием объекта производного класса, в данном случае Tuna.



Основы наследования

261




Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   178   179   180   181   182   183   184   185   ...   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