Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Не підтверджено.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.08 Mб
Скачать

Virtual void FunO {cout«"у класі Base"« endl;}

//...

};

class Derived: public Base { public:

void FunO {cou*<< "У клзсі Derived" « endl;}

};

Int mainO

{

Base *bp, ObjB;

Derived *dp, ObjD;

dp = dynamic_cast<Derived *> (&0bjD); if(dp) {

cout«"Приведення типів"«"(з Derived * у Derived *) реалізовано"« endl; dp->FunO;

}

else

cout«"Помилка"« endl; cout« endl;

bp = dynamic_cast<Base *> (&0bjD); if (bp) {

cout«"Приведення типів" «"(з Derived * у Base *) реалізовано" « endl; bp->Fun();

}

else

cout«"Помилка" « endl; cout« endl;

bp = dynamic_cast<Base *> (&ObjB); if(bp) {

cout«"Приведення типів" « "(з Base * у Base *) реалізовано" « endl; bp->Fun();

}

else

cout«"Помилка" « endl; cout« endl;

dp = dynamic_cast<Derived *> (&ObjB); if(dp) cout«"Помилка" « endl; else

cout«"Приведення типів" « "(з Base * у Derived *) не реалізовано" « endl; cout« endl;

bp = &ObjD; // Присвоєння покажчику адреси об'єкта похідного класу // Ьр вказує на об'єкт класу Derived dp = dynamic_cast<Derived *> (bp); if(dp) {

cout«"Приведення bp до типу Derived *\n"«"реалізовано, оскільки bp дійсно\п"

«"вказує на об'єкт класу Derived"« endl; dp->FunO;

}

else

cout«"Помилка" « endl; cout« endl;

bp = &ObjB; // Присвоєння покажчику адреси об'єкта базового класу // Ьр вказує на об'єкт класу Base dp = dynamic_cast<Derived *> (bp); if(dp)

cout«"Помилка";

else{

cout«"Тепер приведення bp до типу Derived *\n"«"не реалізовано, оскільки bp\n" «"насправді вказує на об'єкт класу Base"« endl;

}

cout« endl;

dp = &ObjD; // Присвоєння покажчику адреси об'єкта похідного класу // dp вказує на об'єкт класу Derived bp = dynamic_cast<Base *> (dp); if(bp) {

cout«"Приведення dp до типу Base * реалізовано"« endl; bp->Fun();

}

else

cout«"Помилка"« endl; getchO; return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати: Приведення типів (з Derived * у Derived *) реалізовано.

У класі Derived.

Приведення типів (з Derived * у Base *) реалізовано.

У класі Derived.

Приведення типів (з Base * у Base *) реалізовано.

У класі Base.

Приведення типів (з Base * у Derived *) не реалізовано.

Приведення Ьр до типу Derived * реалізовано, оскільки Ьр дійсно вказує на об'єкт класу Derived.

У класі Derived.

Тепер приведення Ьр до типу Derived * не реалізовано, оскільки Ьр насправді вказує на об'єкт класу Base.

Приведення dp до типу Base * реалізовано.

У класі Derived.

Оператор dynamic_cast можна іноді використовувати замість оператора typeid. Наприклад, припустимо, що клас Base - поліморфний і є базовим для класу Derived, тоді у процесі виконання такого фрагмента коду програми покажчику dp буде при­своєно адресу об'єкта, яка адресується покажчиком Ьр, але тільки у тому випадку, якщо цей об'єкт дійсно є об'єктом класу Derived:

Base *bp;

Derived *dp;

II...

if(typeid(*bp) == typeid(Derived)) dp = (Derived *) bp;

У цьому випадку використовується звичайна операція приведення типів. Тут це цілком безпечно, оскільки настанова if перевіряє законність операції приведен­ня типів за допомогою оператора typeid до її реального виконання. Те ж саме мож­на зробити ефективніше, замінивши операторів typeid і настанову if оператором dynamic_cast:

dp = dynamic_cast<Derived *> (bp);

Оскільки оператор dynamic_cast успішно здійснюється тільки у тому випадку, якщо об'єкт, який піддається операції приведення до типу, вже є об'єктом або за­даного типу, або типу, виведеного із заданого, то після завершення цієї настанови покажчик dp міститиме або нульове значення, або покажчик на об'єкт типу Derived. Окрім цього, оскільки оператор dynamic_cast успішно здійснюється тільки у тому випадку, якщо задана операція приведення типів правомірна, то у певних ситуаці­ях її логіку можна спростити. У наведеному нижче коді програми показано, як

оператора typeid можна замінити оператором dynamic_cast. Тут здійснюється один і той самий набір операцій двічі: спочатку з використанням оператора typeid, а по­тім - оператора dynamic_cast.

Код програми 10.8. Демонстрація механізму використання оператора dynamic_cast замість оператора typeid #include <iostream> // Для потокового введення-виведення

#include <typeinfo> // Для динамічної ідентифікації типів

using namespace std; // Використання стандартного простору імен

class baseClass { // Оголошення базового класу public: