rozroznienie z ktorej klasy dziedziczącej pochodzi obiekt

0

Witam,

Mam program, który zawiera klase abstrakcyjną i dziedziczące po niej klasy pochodne.

class Osoba{
public:
	virtual void wyswietl()=0;
	virtual void dodaj()=0;
	virtual void usun()=0;
	virtual void zmien()=0;
	virtual void set(string, unsigned short)=0;
};
class Pracownik : public Osoba{
public:
	void wyswietl();
	void dodaj();
	void usun();
	void zmien();
	void set(string, unsigned short);
	string getString();
	unsigned short getInt();
private:
	string _imie;
	string _nazwisko;
	string _miasto;
	string _stanowisko;
	unsigned short _rokUrodzenia;
	
};
class Student : public Osoba{
public:
	void wyswietl();
	void dodaj();
	void usun();
	void zmien();
	void set(string, unsigned short);
	string getString();
	unsigned short getInt(unsigned short);
private:
	string _imie;
	string _nazwisko;
	string _miasto;
	unsigned short _rokUrodzenia;
	unsigned short _nrAlbumu;
};

W funkcji main() tworzona jest tablica wskazujaca na obiekty klasy abstrakcyjnej a w petli wywolywane sa konstruktory klas pochodnych - losowo (Student, Pracownik).

Osoba * listaosob[10];
listaosob[x] = new Pracownik();
...
listaosob[y] = new Student(); 

Pojawia się pytanie... Jak sprawdzić konkretny element tablicy listaosob, pod kątem przynaleznosci do klas Pracownik/Student?

Chodzi o to, że muszę móc je rozróżniać, aby móc wylistować samych Studentów, albo samych Pracowników.

Z góry Dzięki za pomoc

0
if(dynamic_cast<Pracownik*>(listaosob[i])!=NULL) 
{
      ....
}
class Osoba{
        enum TypOsoby {
             TypPracownik, TypStudent
        };
public:
        virtual void wyswietl()=0;
        virtual void dodaj()=0;
        virtual void usun()=0;
        virtual void zmien()=0;
        virtual void set(string, unsigned short)=0;
        virtual TypOsoby typOsoby() const = 0;
};
0

Dzięki Ci, Dobry Człowieku :-)

Nie wiem tylko dlaczego wrzuciłeś tam typ wyliczeniowy:

enum TypOsoby {
             Pracownik, Student
        };

W mojej implementacji też działa:

for(int i=1;i<=I;i++){
				cout << i;
				if(dynamic_cast<Pracownik*>(listaosob[i-1])){
					listaosob[i-1]->wyswietl();}
			}
0

dynamic_cast jest kosztowny, a czasami nawet nie działa poprawnie (pomiędzy dll-kami).
Często lepszym rozwiązaniem jest ten enum. Rozwijając jak takie coś się robi:

template<class T> T* osoba_cast(Osoba* osoba)
{
      if(osoba->typOsoby()==T::ImplementedOsoba) {
            return static_cast<T>(osoba);
      }
      return NULL;
}


// przykład dla Pracownik 
class Pracownik : public Osoba{
public:
        enum {ImplementedOsoba=TypPracownik};

        TypOsoby typOsoby() const
        { return ImplementedOsoba; }

        void wyswietl();
 ......       
};
0

Wygląda to bardzo mądrze i chyba nawet pojąłem sens :-)

Dzięki raz jeszcze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1