Basisklasse definieren aber abgeleitete Klasse an Methode übergeben - geht nicht?



  • Hi,

    ich fürchte, mein Problem ist ganz simpel, aber ich raffe es gerade so gar nicht. Folgendes: ich habe eine Basisklasse und eine davon abgeleitete Klasse, welche die Basisklasse ganz simpel implementiert (vereinfachter Code, da sind tatsächlich noch diverse Parameter im Spiel):

    class  TopClass: public BaseClass
    {
    public:
    ...
    
    // Konstruktor
    TopClass::TopClass()
                   :BaseClass()
    

    Jetzt lege ich mir eine Variable mit der TopClass an:

    TopClass *meineKlasse=new TopClass()
    

    Und dann gibt es da noch eine allgemeingültige Funktion, welche die Basisklasse erwartet:

    MyMessage(BaseClass *var)
    

    Der Punkt ist, sowohl BaseClass als auch MyMessage entstammen einem gekapselten Codeteil, der von TopClass nichts wissen soll.

    Jetzt zu meinem Problem: wenn ich versuche, "meineKlasse" als Parameter an die Methode MyMessage() zu übergeben, dann scheitert das. Der Compiler beschwert sich über einen inkompatiblen Typ. meineKlasse hart auf den Typ BaseClass casten, funktioniert nicht. Die Variable meineKlasse als BaseClass zu definieren und dann aber ein TopClass-Objekt da hinein zu konstruieren ist auch keine Option, da dann niemand auf die TopClass-Methoden in meineKlasse zugreifen kann.

    Deswegen meine Frage: wie geht es richtig? Wie kann ich das TopClass-Objekt meineKlasse an MyMessage() übergeben, so dass MyMessage() auf die BaseClass-Methoden und -Variablen Zugriff hat, ohne was von TopClass wissen zu müssen?

    Danke!



  • Merkwürdig, ein upcast sollte immer funktionieren.
    Poste doch bitte mal ein Minimalbeispiel und die dazugehörige Fehlermeldung.



  • Die Codebeispiele oben sind praktisch schon das Minimalbeispiel. Der betreffende Aufruf lautet

    MyMessage(meineKlasse)
    

    und die Fehlermeldung ist

    argument of type "TopClass*" is incompatible with parameter of type "BaseClass *"



  • Ein Minimalbeispiel sollte, wenn möglich, einfach Kompilierbar und ausführbar sein.

    Prinzipiell geht, was du beschreibst:

    https://godbolt.org/z/sPfTKEzeE

    (Achtung std::println ist c++23 )



  • @Elmi
    Irgendwas verheimlichst du uns: C++ shell

    Edit:
    Verflixt, Schlangenmensch war schneller 😉



  • OK, ich hab's gefunden: an der Stelle, an der MyMessage() aufgerufen wurde, hat das Include gefehlt, welches die Definition von TopClass enthält. Sprich es war an der Stelle nicht bekannt, dass TopClass und BaseClass miteinander verwandt sind 😨


Anmelden zum Antworten