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.


  • Mod

    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!


Anmelden zum Antworten