Zeigervergleich mit unvollständigen Informationen bei Vererbung
-
Hi,
ich habe eine Klasse A, wovon Klassen B und C erben.
In irgendeiner anderen Klasse D werden jetzt nur Zeiger verwaltet, Implementierungsdetails von A, B, C sind hier nicht notwendig, weswegen ich dort natürlich nur forward declarations verwende.
Ich habe dort zwei Zeiger:
B* b; C* c;
und eine Funktion:
A* getCurrentA();
Ich möchte nun getCurrentA() mit b oder c vergleichen, habe aber natürlich mit forward declarations nicht die Infos, dass B von A oder C von A erbt. Ich kann also keinen Zeigervergleich ohne casts machen.
Findet ihr es legitim hier die Typsicherheit zu umgehen, indem ich reinterpret-caste?
Die Alternative wäre die Header von (A,) B und C zu inkludieren. D benötigt diese Informationen jedoch sonst an keiner Stelle, ich würde also unnötige (bis auf eben diesen Zeigervergleich) physische Abhängigkeiten schaffen.
Viele Grüße
Eisflamme
-
Der Cast ist eine schlechte Idee, da die Adressen nicht zwingend die gleichen sein müssen. Ein Beispiel wäre bei Mehrfachvererbung oder ein hier eventuell passenderes Polymorphie:
class A { public: int x; }; class B : public A { public: virtual ~B() = default; int y; }; int main() { B b; B* p1 = &b; A* p2 = &b; cout << p1 << endl; cout << p2 << endl; }
Mögliche Ausgabe unter Windows:
003AFE98 003AFE9C
Wenn du also deinen
reinterpret_cast
machst kriegst du vermutlich raus das die Objekte unterschiedlich sind, auch wenn es eigentlich die gleichen wären.
-
Findet ihr es legitim hier die Typsicherheit zu umgehen, indem ich reinterpret-caste?
Kommt auf die Art der Klassen an. Haben sie Standardlayout? Ansonsten ist der Vergleich nicht sinnvoll, da er false negatives liefern könnte.
-
Oh, da muss ich natürlich tatsächlich aufpassen, gut dass ich gefragt hab. Danke!