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



Download 1,38 Mb.
bet207/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   203   204   205   206   207   208   209   210   ...   437
Bog'liq
word1

... другие члены public:

Tuna * Clone() const // виртуальная функция клонирования

{
return new Tuna(*this); // вернуть новый объект класса Tuna,





    1. являющийся копией этого

Таким образом, виртуальная функция C lo n e () моделирует виртуальный конструктор копий, который должен быть вызван явно, как представлено в листинге 11.9.

ЛИСТИНГ 11.9. Классы Tuna и Carp с функцией Clone (),


моделирующей виртуальный конструктор копий______________________________________





  1. #include




  1. using namespace std;



2 :

  1. class Fish




  1. {




  1. public:




  1. virtual Fish* Clone () = 0;




  1. virtual void Swim() = 0;




  1. };

9:


10: class Tuna: public Fish


11: {

  1. public:




  1. Fish* Clone()




  1. {




  1. return new Tuna (*this);




  1. }



17:



  1. void Swim()




  1. {

    20:

    cout « "Tuna swims fast in the sea" « endl;

    2 1 :

    }

    2 2 :

    };

    23:




  2. class Carp: public Fish




  1. {




  1. Fish* Clone ()




  1. {



28 return new Carp(*this);

Виртуальные конструкторы копий?

297

void Swim ()

{
cout « "Carp swims slow in the lake" « endl;


6: int main()


const int ARRAY_SIZE = 4;


Fish* myFishes[ARRAY_SIZE] = {NULL};


myFishes[0] = new Tuna();


myFishes[1] = new Carp();


myFishes[2] = new Tuna();


myFishes[3] = new Carp();
о
r 6 Fish* myNewFishes[ARRAY_SIZE];


for (int Index = 0; Index < ARRAY_SIZE; ++Index) myNewFishes[Index] = myFishes[Index]->Clone();
4 9 :


5j: // вызов виртуального метода для проверки


for (int Index = 0; Index < ARRAY_SIZE; ++Index)



  1. myNewFishes[Index]->Swim();





  1. // очистка памяти



for (int Index = 0; Index < ARRAY_SIZE; ++Index)



  1. {



delete myFishes[Index];


5 3 : delete myNewFishes[Index];

  1. }





return 0;

-2: -}



Результат


Tuna swims fast in the sea


Carp swims slow in the lake


Tuna swims fast in the sea


Carp swims slow in the lake


Анализ

Строки 40 -44 в функции m a in () демонстрирую т объявление статического массива указателей на базовый класс F is h * и индивидуальное присвоение его элементам вновь


созданных объектов класса Tuna, C a rp , T una и C a r p соответственно. Обратите внимание на то, что этот массив m y F is h e s способен хранить объекты, казалось бы, разных типов, которые связаны общим базовым классом F is h . Это уже замечательно по сравнению с предыдущими массивами в этой книге, которые по большей части имели простой одно­ образный тип in t . Если этого недостаточно — замечательно, вы можете копировать в но­ вый массив m y N e w F is h e s типа F is h * при помощи вызова в цикле виртуальной функции


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


F i s h : : C lo n e (), как показано в строке 48. Обратите внимание, что массив очень мал: только четыре элемента. Он может быть много больше, хотя это и не будет иметь большо­ го значения для логики копирования, а только потребует коррекции условия завершения цикла. Строка 52 фактически является проверкой, где вы вызываете виртуальную функ­ цию F i s h : : Sw im () для каждого хранимого в новом массиве элемента, чтобы проверить, скопировала ли функция C lo n e () объект класса T u n a как T u n a , а не только как F is h . Вывод демонстрирует, что все скопировано правильно.



РЕКОМЕНДУЕТСЯ

Отмечайте виртуальными те функции базового класса, которые должны быть переопределены в производных классах


Помните, что чистые виртуальные функции де­ лают класс абстрактным, а сами эти функции должны быть реализованы в производном классе


Учитывайте возможность использования вир­ туального наследования



Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   203   204   205   206   207   208   209   210   ...   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