O
HumeSikkins schrieb:
otze schrieb:
als beispiel für soeine methode zb:int getClassId(), damit kannst du sowas machen:
A* a=...;
if(a->getClassId()==1){//objekt vom typ B
B* b=static_cast<B*>(a);
}
if(a->getClassId()==2){//objekt vom typ C
C* c=static_cast<C*>(a);
}
Warum nur schlägst du sowas vor? So einen Code schreibt man nur, wenn jemand mit einer Waffe auf einen zielt und selbst dann mit Sicherheit nicht innerhalb einer Basisklassenmethode.
vor ca nem viertel jahr wurde die lösung über id statt dynamic_cast hier als nonplusultra hochgelobt, und das merk ich mir halt.
so wies aussieht, hat Niobird basisklassenpointer, und da hilft typeid so ziemlich garnichts.
Warum nicht? Worin unterscheidet sich deiner Meinung nach
if (typeid(*basePtr) == typeid(DerivedClass))
...
von
if (basePtr->GetClassId() == DERIVED_CLASS_ID)
...
Unter der Annahme, dass die Basisklasse mindestens eine virtuelle Methode hat (und das wollen unter Berücksichtigung der öffentliche Ableitung doch schwer hoffen), liefert typeid hier den "dynamic type".
k, wusste nicht dass typeid das auch über solche umwege schafft.
@topic du musst entweder dynamic_cast benutzen, oder in deine Klassen eine methode einfügen die dir mitteilt, von welchem typ die Klassen sind
Das ist der Hack. Besser wäre es allerdings den Ursprung des Problems zu bekämpfen, statt nur die Auswirkung.
das ist natürlich klar,aber es gibt ein paar fälle, in denen das nicht klappt.
btw: wielange braucht eigentlich ein aufruf von typeid(Class)? ist klar, dass es implementationsspezifisch ist, aber was kann man da so über den daumen gepeilt sagen?