31.12.2014 Views

Paskaitų konspektai - Matematikos ir Informatikos fakultetas ...

Paskaitų konspektai - Matematikos ir Informatikos fakultetas ...

Paskaitų konspektai - Matematikos ir Informatikos fakultetas ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!