Paskaitų konspektai - Matematikos ir Informatikos fakultetas ...
Paskaitų konspektai - Matematikos ir Informatikos fakultetas ...
Paskaitų konspektai - Matematikos ir Informatikos fakultetas ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Objektų tipų identifikacija programos vykdymo metu<br />
Objektų tipų identifikacija programos vykdymo metu (run-time type identification)<br />
galioja tiek vienalypiam, tiek <strong>ir</strong> daugialypiam paveld÷jimui. Prisiminkime, jog klas÷,<br />
turinti v<strong>ir</strong>tualų destruktorių arba bent vieną v<strong>ir</strong>tualų metodą, vadinama polimorfine<br />
klase. Kaip jau žinome, visų paveld÷jusių klasių objektai kartu yra <strong>ir</strong> bazin÷s klas÷s<br />
objektai, tod÷l galime "natūraliai" atlikti tipų konversiją iš paveld÷jusios klas÷s į<br />
bazinę:<br />
// rtti.cpp<br />
class A { public: v<strong>ir</strong>tual ~A() {} };<br />
class B : public A {};<br />
int main ()<br />
{<br />
A* a = new A();<br />
B* b = new B();<br />
a = b; // natūrali tipų konversija<br />
}<br />
Jau programos kompiliavimo metu yra žinoma, kad rodykl÷ b rodo į klas÷s B tipo<br />
objektą, kuris paveldi iš klas÷s A. Tod÷l priskyrimo sakinys a = b yra korektiškai<br />
išsprendžiamas dar kompiliavimo metu. Kartais reikia atlikti atv<strong>ir</strong>kščią tipų<br />
konversiją: turime rodyklę į A, bet iš anksto tikim÷s, kad ji bus nukreipta į objektą B.<br />
Ar tai tiesa ar ne galime patikrinti tik programos vykdymo metu. Polimorfin÷s klas÷s<br />
ar nuo jos paveld÷jusių klasių objektams programos vykdymo metu saugoma<br />
informacija apie objekto tipą. Šiuo atveju, naudojantis raktiniu žodeliu<br />
dynamic_cast, mes galime atlikti saugią tipų konversiją iš bazin÷s klas÷s A, į<br />
paveld÷jusią klasę B, nes klas÷ A turi v<strong>ir</strong>tualų destruktorių:<br />
void safeCastFromAtoB (A* a)<br />
{<br />
B* b = dynamic_cast(a);<br />
if (b == 0) cout