Prev Next Up Title Contents Index

RTTI (Run Time Type Information)

Palataan vielä esimerkkiin, jossa p on osoitin graafiseen olioon. Vaikka sijoituksen p = &y jälkeen voisikin kuvitella, että voidaan tehdä kutsu

	p->muuta_koko(5);
ei tämä ole mahdollista, koska graafisessa oliossa ei ole ao. metodia. Toisaalta jos ollaan VARMOJA siitä, että p osoittaa ympyrään, voidaan tietysti tehdä tyyppikonversio:
	((cYmpyra *)p)->muuta_koko(5);
Mistä tämä varmuus saadaan? Viimeisimmässä standardiluonnoksessa on tähän joitakin keinoja:
	#include <typeinfo.h>                  // Esittelee typeinfo-luokan
	...
	printf("%s\n",typeid(*p).name);        // Jos halutaan merkkijonona olion tyyppi
	if ( typeid(*p) == typeid(cYmpyra) )...// Verrataan onko olio haluttua luokkaa
Toisaalta joskus haluttaisiin tietää onko olio jonkin toisen olion jälkeläinen. Joissakin oliokielissä tämä voidaan selvittää kutsulla
	if ( *p is cSateellinenOlio) ... // EI valitettavasti C++:ssa
Usein kuitenkin pärjätään dynaamisella tyypinmuunnoksella :
	caKuvioJollaSade *ps = dynamic_cast<caKuvioJollaSade *>(p);
	if ( ps ) ps->muuta_koko(4);
Eli jos p voidaan konvertoida osoittimeksi säteelliseen olioon, niin ps on osoitin samaan paikkaan kuin p, mutta tyypiltään sellainen että esimerkissä ps->muuta_koko on laillinen. Luokassa typeinfo on vielä funktio before:
	if ( typeid(cSateellinenOlio).before(typeid(*p)) ...
mutta tämä ei suinkaan palauta tietoa siitä, onko ehto totta perimisjärjestyksen mukaan, ainoastaan tietyn järjestysrelaation mukaan, jonka avulla tyypit voidaan sijoittaa esimerkiksi binääripuuhun.


Prev Next Up Title Contents Index