Monogima bi ovo moglo biti interesantno pogotovu pri izradi seminarskog rada kada recimo iz nekog niza pokazivaca na osnovnu klasu treba da izmu ( ili urade nešto ) sa konkretno jednim tipom instanci.
Imamo osnovnu klasu Osnovna i iz nje izvedene klase Izvedena2 i Izvedena3.
Onda napravimo niz pokazivača na osnovnu klasu Osnovna *pok[10] koji ćemo dinamički popuniti sa istancama ili izvedene2 ili Izvedene3 klase.
Sad ako želite da prođete kroz niz i da uradite nešto samo sa instancema klase recimo Izvedena2 koristi se metoda typeid(instanca) koja vraća tip instance klase.
Da bi mogla ova metoda da se koristi mora se includovati <typeinfo.h> bibioteka.
Ako se koristi VS6 mora ju se uključiti RTTI opcije ručno dok je u novijim veryijama VS-a ovo uključeno po difoltu.
Da bi mogao da se dobije podatak konkretno o kojoj izvedenoj klasi se radi moraju se uključiti RTTI opcije
a bez njih može se dobiti samo podatak o pokazivaču na osnovnu klasu.
Na sledeći način se u VS6 uključuju RTTI opcije:
1. U projektu za koji želite da omogućite RTTI opcije u meniju idete na Project pa Settings
2. Selektujte C/C++ karticu i na njoj u padajućem meniju za kategoriju izaberite C++ Language
3. Čekorajte "Enable Run-Time Type Information (RTTI)"
4. Ponovo izbildujte projekat i sve ce da radi
Nakon ovoga možete da koristite
cout<<typeid(*pok[i]).name();
i da kao izlaz dobijte konkretno o kojoj izvedenoj klasi se radi tj. Izvedena2 ili izvedena3.
Ovako izgleda jedan test programčić koji to i demonstrira.
#include <iostream.h>
#include <typeinfo.h>
class Osnovna{
int atribut1;
public:
Osnovna(){};
void setAtribut1(int a){atribut1=a;};
int getAtribut1()const{return atribut1;};
Osnovna(int a):atribut1(a){};
~Osnovna(){};
virtual void ispis()=0;
};
class Izvedena2:public Osnovna{
int atribut2;
public:
Izvedena2(){};
void setAtribut2(int a){atribut2=a;};
int getAtribut2()const{return atribut2;};
Izvedena2 (int a1, int a2):Osnovna(a1),atribut2(a2){};
~Izvedena2(){};
virtual void ispis(){cout<< this->getAtribut1()+atribut2<<endl;};
};
class Izvedena3:public Osnovna{
int atribut3;
public:
void setAtribut3(int a){atribut3=a;};
int getAtribut3()const{return atribut3;};
Izvedena3 (int a1, int a3):Osnovna(a1),atribut3(a3){};
~Izvedena3 (){};
virtual void ispis(){cout<<this->getAtribut1()+atribut3<<endl;};
};
main(){
int izbor,i;
Osnovna *pok[5];
Izvedena2 iz2;//sluzi zamo za proveru tipa,tj da se sa njom poredi *pok[i]
for (i=0;i<5;i++){
cout<<"Uneti izbor izvedena1:1 ili izvedena2:2 \n";
cin>> izbor;
switch(izbor){
case 1 : pok[i]=new Izvedena2(1,2);break;
case 2 : pok[i]=new Izvedena3(1,3);break;
};
};
for (i=0 ; i < 5 ; i++){
cout << typeid(*pok[i]).name() <<endl ;
cout << typeid(pok[i]).name() <<endl ;
if(typeid(*pok[i]) == typeid(iz2))
cout<<"Poklapa se\n";
cout<<endl;
}
pok[3]->ispis();
return 0;
}
Probajte, korisno je!!!