Cześć.
Sytuację przedstawia poniższy pseudokod:
class Bazowa {
protected:
int jakiespoleWspolne1;
string jakiespoleWspolne2;
//itd
};
class Pochodna1 : public Bazowa
private:
int mojepole;
public:
setMojePole(int mojepole);
int getMojePole();
}
class Pochodna2 : public Bazowa
{
private:
int costam;
string costam2;
public:
setCostam(int c);
setCostam2(string c2);
int getCostam();
string getCostam2();
}
Jest taka sytuacja: mam klasę bazową z kilkoma polami oraz klasy pochodne (które mają swoje pola, różnych typów, w różnej ilości). I teraz mam pytanie: czy lepiej zastosować funkcje wirtualne (i wypisać te wszystkie funkcje wirtualne - przeważnie settery/gettery - dla wszystkich funkcji pochodnych) w klasie bazowej czy zaoszczędzić na czasie i zrobić taki myk:
Pochodna1 pochodna;
pochodna.setMojePole(3445);
Bazowa * bazowa = &pochodna; //konwerujemy do typu bazowego
zrobCos(bazowa); //funkcja zrobCos przyjmuje jako parametr wskaźnik na bazową
//i teraz zeby dobrac sie do pola (czy też metody) klasy pochodnej trzeba przecastować
Pochodna * zPowrotem = dynamic_cast<Pochodna*>(bazowa);
cout<<zPowrotem->getMojePole(); //wyswietli 3445
Wydaje mi się że dla moich celów ta metoda z dynamic castem jest lepsza ponieważ każda klasa pochodna ma swoje własne pola, które są inne niż w innych klasach pochodnych (ale muszą mieć kilka pól i metod wspólnych z klasy bazowej) i lepiej jest zrobić tak niż wypisywać kilkanaście (dziesiąt) metod wirtualnych. Dane te przesyłam przez socketa, więc i tak identyfikuje typ obiektu przez pole przesłane przed danymi właściwymi w postaci int (np. 1 - Pochodna, 2 - Pochodna2 itd.)