dynamic_cast <тип *> (өрнек)
Өрнек
класқа нұсқауыш немесе сілтеме болып, ал
тип
осы класс үшін
базалық немесе туынды класс болуы тиіс. Түрлендірудің орындалу мүмкіндігі
тексерілгеннен кейін, егер ол сəтті орындалса, операция берілген типтегі
нəтиже қалыптастырады, кері жағдайда нұсқауыш үшін нəтиже нөлге тең
1
бо-
лады, ал сілтеме үшін –
bad_cast
аластамасы туындайды. Егер берілген тип
пен өрнектің типі бір иерархияға жатпаса, түрлендіруді жүзеге асыру мүмкін
болмайды.
Базалық кластан туынды класқа түрлендіру төмендететін түрлендіру
(downcast) деп аталады, өйткені графикалық түрдегі мұралау иерархиясын-
да туынды кластар базалық кластардан төменірек бейнеленеді. Туынды кла-
стан базалық класқа келтіру жоғарылататын түрлендіру (upcast) деп, ал
бір базалық класс ішіндегі туынды кластар арасындағы немесе керісінше,
бір туынды кластың базалық кластары арасындағы келтіру операциялары
қиылысқан түрлендіру (crosscast) деп аталады.
Жоғарылататын түрлендіру
Жоғарылататын түрлендіруді
dynamic_cast
операциясы арқылы орындау
қарапайым меншіктеумен (ашық мұралау кезінде) бірдей болып саналады:
class В{ /* ... */ };
class С: public В{ /* ... */ };
С* с = new С;
В* b = dynamic_cast(c); // В* b = с
э
квивалентті;
Төмендететін түрлендіру
dynamic_cast
операциясы көбінесе төмендететін түрлендіруде –
компилятордың түрлендіру дұрыстығын тексеру мүмкіндігі болмаған кезде
қолданылады.
Туынды кластар құрамында базалық кластарда жоқ функциялар болуы
мүмкін. Оларды базалық кластың нұсқауышы арқылы шақыру үшін осы
нұсқауыштың расында да туынды кластың объектісіне сілтеме жасайты-
нына сенімді болу керек. Мұндай тексеру
RTTI
(run-time type information)
– «программаның атқарылуы кезіндегі тип туралы ақпарат» арқылы типті
келтіруді жүзеге асыру сəтінде орындалады. Түрлендіруді тексеру мүмкіндігі
орындалуы үшін
dynamic_cast
операциясының аргументі полиморфты тип-
те болуы тиіс, яғни оның кем дегенде бір виртуалды əдісі (222 б. қараңыз)
болуы керек.
1
Егер өрнек нөлге тең болса, оның нəтижесі де нөлге тең болады.
252
Достарыңызбен бөлісу: |