2012-12-19 11 views
6

Jeśli mam następujących klas:instanceof dla obiektów w C++ (nie wskazówek)

class Object { ... } 

class MyClass1: public Object { ... } 

class MyClass2: public Object { ... } 

i stosu: std::stack<Object> statesObjects;

MyClass1 c1; 
MyClass2 c2; 

statesObjects.push(c1); // okay 
statesObjects.push(c2); // okay 

Jak mogę pop je i pobrać element Pod głowa stosu (z top()) bez dynamic_cast, ponieważ nie pracuję tutaj ze wskaźnikami?

Odpowiedz

8

Odpowiedź jest krótka, że ​​z Twojego stosu jak jest nie można wyskoczyć elementy jako elementy typu klasy pochodnej. Wstawiając je do stosu, masz w plasterkach do klasy elementów stosu. Oznacza to, że tylko ta część klasy podstawowej została skopiowana do stosu.

Można mieć stos wskaźników, jednak i wtedy można użyć dynamic_cast pod warunkiem, że statycznie wiadomo klasa ma przynajmniej jedną funkcję virtual członkowskim, lub jako średnia mówi, pod warunkiem, że statycznie wiadomo klasa jest polimorficzny .

Jednak na trzeciej i chwytającej ręce zamiast oprawy w stylu Java używana jest funkcja wirtualna we wspólnej klasie bazowej. Często działa po prostu bezpośrednio mieć taką funkcję. W przypadku bardziej skomplikowanych scenariuszy może być konieczne użycie modelu odwiedzającego (google it), ale w zasadzie chodzi o to, że funkcje wirtualne są obsługiwane w języku w bezpieczny sposób, aby uzyskać efekt downcastów.

+0

Dzięki za pomoc. – ron

2

Nawet jeśli wydaje się, że przechowujesz obiekt klasy pochodnej w klasie, to zapisywany jest tylko element klasy klasy Base. W skrócie Otrzymujesz Obiekt Krojenie obiektów.

Podsumowując, nie można przechowywać obiektów klas pochodnych w tym kontenerze. Będziesz musiał zapisać wskaźnik w Base jako typ zbrojenia i użyć dynamicznego polimorfizmu, aby to osiągnąć.

dobre Przeczytaj:
What is object slicing?