2012-08-14 6 views
5

Mögliche Duplizieren:
Finding the type of an object in C++prüft ein Zeiger auf eine bestimmte Klasse C++

Ich habe eine Frage mit Zeigern zu überprüfen, ob sie zu einer bestimmten abgeleiteten Klasse entsprechen und nehmen nötige Aktion.

Nehmen wir an, ich habe derzeit 2 abgeleitete Klassen DerivedClass1 und DerivedClass2 und die Basisklasse BaseClass. Ich möchte die folgende Aktion überprüfen.

Ptr<BaseClass> ptr;

if (ptr points to DerivedClass1) { action1 } sonst { action2 }

Wie prüfe ich für ptr Punkte auf einen bestimmten DerivedClass?

+2

Nein, wahrscheinlich möchten Sie * nicht wissen, was der dynamische Typ von '* ptr' ist. –

Antwort

10

Wenn BaseClass polymorph (enthält virtuelle Funktionen) können Sie testen:

if (dynamic_cast<DerivedClass1*>(ptr.get())) 

Aber in der Regel sollten Sie dynamische Dispatch verwenden als Abwickler schlägt vor, möglicherweise ein Besucher-Muster, für diese Art der Sache. Littering Ihren Code mit dynamic_cast macht es schwer zu pflegen. Ich benutze dynamic_cast fast nie.

20

Wenn Sie ein bisschen mehr objektorientiert denken, würden Sie nur eine virtuelle Methode auf der Basisklasse machen:

Ptr<BaseClass> ptr; 

ptr->Action(); 

und haben jede Klasse sie implementieren je nach Bedarf. Mir ist klar, dass dies keine wirkliche Antwort ist, aber es ist eine alternative Methode, um Ihr Ziel zu erreichen, das oft als besser angesehen wird. Deshalb denke ich, dass es erwähnenswert ist.

+0

danke. Das war mein erster Gedanke, aber ich hatte das Problem, eine konstante Methode in einer bestimmten Klasse und eine nicht konstante in einer anderen Klasse zu haben, also versuchte ich, dieses Verhalten in einer neuen Methode hinzuzufügen. – lordlabakdas

4
if(dynamic_cast<DerivedClass1*>(ptr)) 
{ 
    // Points to DerivedClass1 
} 
else if(dynamic_cast<DerivedClass2*>(ptr) 
{ 
    // Pointes to DerivedClass2 
} 
+0

Wenn es eine dritte Ebene gäbe, sagen wir "DerivedClass1_1" und "DerivedClass1_2", würde die erste "if" -Klausel beide als "DerivedClass1" behandeln - das könnte oder könnte nicht das sein, was das OP will. –

+0

@ Component10 Ich habe einfach die Frage des OP beantwortet. Ich dulde diese Praxis nicht, und normalerweise finde ich, dass dies nur benötigt wird, wenn _Bad-Design-Entscheidungen_ getroffen wurden. Danke, dass Sie die Erbschaftssituation aufgezeigt haben, falls das OP beschließt, so etwas zu versuchen. – Aesthete

Verwandte Themen