У мові програмування оператор dynamic_cast
є частиною механізму динамічної ідентифікації типів даних, який дозволяє виконувати приведення типів даних. На відміну від звичайного приведення типів у стилі С, перевірка коректності приведення типів відбувається під час виконання програми. Оператор dynamic_cast
можна застосовувати до вказівників або посилань. Якщо відбувається приведення вказівника до типу, яким об’єкт фактично не є, то результатом приведення буде нульовий вказівник. При роботі з посиланнями, якщо приведення неможливе, буде згенеровано виняток (exception) std::bad_cast. Такою поведінкою оператор dynamic_cast
подібний до приведення типів у таких мовах програмування, як Java, і відрізняється від приведення в мові С, де коректність приведення типу під час виконання програми не перевіряється.
Приклад
Припустимо, у нас є функція, що приймає аргументом об’єкт типу A
і повинна виконати деякі додаткові дії у випадку, якщо параметр насправді є об’єктом типу B
— нащадком класу A
. Таку поведінку можна реалізувати, використавши dynamic_cast
у наступний спосіб.
#include <typeinfo> // Для std::bad_cast #include <iostream> // Для std::cerr та ін. class A { public: // Механізм динамічного визначення типів даних можливий тільки для поліморфних // класів (тобто класів, що містять хоча б одну віртуальну функцію) virtual void foo(); // інші члени класу... }; class B : public A { public: void methodSpecificToB(); // інші члени класу... }; void my_function(A& my_a) { try { B& my_b = dynamic_cast<B&>(my_a); my_b.methodSpecificToB(); } catch (const std::bad_cast& e) { std::cerr << e.what() << std::endl; std::cerr << "Цей об\'єкт не є об\'єктом класу B" << std::endl; } }
Можна записати аналогічний код з використанням указівників замість посилань:
void my_function(A* my_a) { B* my_b = dynamic_cast<B*>(my_a); if (my_b) my_b->methodSpecificToB(); else std::cerr << "Цей об\'єкт не є об\'єктом класу B" << std::endl; }
Див. також
Посилання
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U movi programuvannya C operator dynamic cast ye chastinoyu mehanizmu dinamichnoyi identifikaciyi tipiv danih yakij dozvolyaye vikonuvati privedennya tipiv danih Na vidminu vid zvichajnogo privedennya tipiv u stili S perevirka korektnosti privedennya tipiv vidbuvayetsya pid chas vikonannya programi Operator dynamic cast mozhna zastosovuvati do vkazivnikiv abo posilan Yaksho vidbuvayetsya privedennya vkazivnika do tipu yakim ob yekt faktichno ne ye to rezultatom privedennya bude nulovij vkazivnik Pri roboti z posilannyami yaksho privedennya nemozhlive bude zgenerovano vinyatok exception std bad cast Takoyu povedinkoyu operator dynamic cast podibnij do privedennya tipiv u takih movah programuvannya yak Java i vidriznyayetsya vid privedennya v movi S de korektnist privedennya tipu pid chas vikonannya programi ne pereviryayetsya PrikladPripustimo u nas ye funkciya sho prijmaye argumentom ob yekt tipu A i povinna vikonati deyaki dodatkovi diyi u vipadku yaksho parametr naspravdi ye ob yektom tipu B nashadkom klasu A Taku povedinku mozhna realizuvati vikoristavshi dynamic cast u nastupnij sposib include lt typeinfo gt Dlya std bad cast include lt iostream gt Dlya std cerr ta in class A public Mehanizm dinamichnogo viznachennya tipiv danih mozhlivij tilki dlya polimorfnih klasiv tobto klasiv sho mistyat hocha b odnu virtualnu funkciyu virtual void foo inshi chleni klasu class B public A public void methodSpecificToB inshi chleni klasu void my function A amp my a try B amp my b dynamic cast lt B amp gt my a my b methodSpecificToB catch const std bad cast amp e std cerr lt lt e what lt lt std endl std cerr lt lt Cej ob yekt ne ye ob yektom klasu B lt lt std endl Mozhna zapisati analogichnij kod z vikoristannyam ukazivnikiv zamist posilan void my function A my a B my b dynamic cast lt B gt my a if my b my b gt methodSpecificToB else std cerr lt lt Cej ob yekt ne ye ob yektom klasu B lt lt std endl Div takozhPrivedennya tipiv Dinamichna identifikaciya tipiv angl RTTI static castPosilannya