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



Download 1,38 Mb.
bet236/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   232   233   234   235   236   237   238   239   ...   437
Bog'liq
word1

#include




    1. using namespace std;

  1. :




  1. class Fish




  1. {




  1. public:




  1. virtual void Swim()




  1. {




  1. cout « "Fish swims in water" « endl;




  1. }

1 0 :



  1. // базовый класс всегда должен иметь виртуальный деструктор




  1. virtual -Fish() {}




  1. };



14:


15: class Tuna: public Fish

344 ЗАНЯТИЕ 13. Операторы приведения



  1. {




  1. public:




  1. void Swim()




  1. {

    20:

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

    2 1 :

    }

    2 2 :




  2. void BecomeDinner()




  1. {




  1. cout « "Tuna became dinner in Sushi" « endl;




  1. }




  1. };



28:



  1. class Carp: public Fish




  1. {




  1. public:




  1. void Swim()




  1. {




  1. cout « "Carp swims real slow in the lake" « endl;




  1. }



36:



  1. void Talk()




  1. {




  1. cout « "Carp talked crap" « endl;




  1. }




  1. };



42:



  1. void DetectFishType(Fish* InputFish)




  1. {




  1. Tuna* pIsTuna = dynamic_cast (InputFish);




  1. if (pIsTuna)




  1. {




  1. cout « "Detected Tuna. Making Tuna dinner: " « endl;




  1. pIsTuna->BecomeDinner(); // вызов Tuna::BecomeDinner




  1. }



51:



  1. Carp* plsCarp = dynamic_cast (InputFish);




  1. if(plsCarp)




  1. {




  1. cout « "Detected Carp. Making carp talk: " « endl;




  1. pIsCarp->Talk(); // вызов Carp::Talk




  1. }



58:



  1. cout « "Verifying type using virtualFish::Swim: " « endl;




  1. InputFish->Swim(); //вызоввиртуальной функции Swim




  1. }



62:



  1. int main()




  1. {




  1. Carp myLunch;




  1. Tuna myDinner;



67



  1. DetectFishType(SmyDinner);




  1. cout « endl;

Операторы приведения C++

345




  1. DetectFishType(&myLunch);








  1. return 0;



73:}


Результат


Detected Tuna. Making Tuna dinner:


Tuna became dinner in Sushi


Verifying type using virtual Fish::Swim:


Tuna swims real fast in the sea


Detected Carp. Making carp talk:


Carp talked crap


Verifying type using virtual Fish::Swim:


Carp swims real slow in the lake


Анализ

Это иерархия классов T u n a , C a r p и F is h , рассматривавш аяся на занятии 10, “Реа­ лизация наследования”. Напомню, что эти два производных класса не только реализуют виртуальную функцию .Sw im (), но и содержат функцию, специфическую для каждого из типов, а именно T u n a : : B e c o m e D in n e r ( ) и C a r p : : T a lk ( ) . Особенным в этом примере


является то, что, имея экземпляр базового класса F is h * , вы можете динамически обна­


ружить, указывает ли этот указатель на объект класса T un a или C a rp . Это динамическое обнаружение или идентификация типа времени выполнения осущ ествляется в функции D e t e c t F is h T y p e (), определенной в строках 43 -61. В строке 45 оператор d y n a m ic _ c a s t используется для проверки характера входного указателя базового класса типа F is h * на тип T u n a * . Если это указатель на тип T un a, оператор возвращ ает допустимый адрес, в противном случае — значение NULL. Следовательно, результат оператора d y n a m ic c a s t всегда должен проверяться на допустимость. После проверки успешности в строке 46 вы знаете, что указатель p I s T u n a указывает на допустимый объект класса T una, и в состоя­ нии использовать его для вызова функции T u n a : : B e c o m e D in n e r (), как демонстрирует строка 49. С карпом вы используете указатель для вызова функции C a r p : : T a lk (), как демонстрирует строка 56. Перед выходом функция D e t e c t F is h T y p e () осущ ествляет проверку типа, вызвав метод F i s h : : Swim (), который, будучи виртуальным, переадресо­ вывает вызов методу Swim ( ) , реализованному в классе T un a или C a r p соответственно.


Возвращаемое значение оператора dynamic_cast всегда следует прове­ рять на допустимость. Когда приведение недопустимо, возвращается значение NULL.


Использование оператора reinterpret_cast



Оператор приведения C++ r e i n t e r p r e t c a s t ближе всех к приведению в стиле С. Он позволяет разработчику приводить один тип объекта к другому, независимо от того, связа­ ны ли их типы, т.е. он интерпретирует тип с использованием следующего синтаксиса:



346 ЗАНЯТИЕ 13. Операторы приведения


Base * pBase = new Base ();


CUnrelated * pUnrelated = reinterpret_cast(pBase); // Такой код плох, даже когда он компилируется!

Это приведение фактически вынуждает компилятор принять ситуации, которые обыч­ но не разрешил бы оператор s t a t i c _ c a s t . Он находит применение в определенных низ­ коуровневых приложениях (таких, как драйверы, например), где данные должны быть пре­ образованы в простой тип, который может принять интерфейс API (например, некоторые функции API работают только с байтовыми потоками, т.е. u n s ig n e d ch a r* ):





Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   232   233   234   235   236   237   238   239   ...   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