Vererbungsproblematik: Konstruktor aus BasisKl & überschreibende Methode aus Abgel. Klasse



  • Hallo,

    Ich habe eine Basisklasse. Der Konstruktor dazu erzeugt mir sämtliche notwendigen Klassenvariablen auch für die abgeleiteten Klassen. Deshalb hatte ich zuerst den Konstruktor in den abgeleiteten Klassen so festgelegt:

    Child(Datentyp *x, Datentyp *y, Datentyp *z) : Parent(x, y, z) {};

    Also der Konstruktor der Basisklasse wird aufgerufen. Ich habe eine virtuelle Methode in der Basisklasse Parent.

    virtual wxString *SetInput(size_t p_Index, size_t p_Zeile);

    und jedes Child sollte diese überschreiben. Bei der Instanzbildung erzeuge ich ein Objekt von Child, jedoch wurde immer die Methode SetInput aus der Basisklasse ausgeführt! Wenn ich den Konstruktor aus der Basisklasse als Konstruktor für die abgeleitete Klasse schreibe (also aus Parent::Parent() ein Child::Child() mache), dann funktioniert es auch wie gehabt mit der Überschreibung der virtuellen Methode.

    Also ich rufe quasi den Konstruktor aus der Childklasse auf, welcher wiederum den Konstruktor aus der Basisklasse aufruft aber somit womöglich ein Objekt des Typs Parent macht statt Child!? Also auch wenn ich eine Lösung jetzt habe (wohlgemerkt eine sehr unelegante und dem Sinn einer Vererbung widersprechenden Lösung), verstehe ich die Ursache nicht, weshalb meine erste Version nicht geklappt hatte, bzw. ob es eine elegantere Methode gibt.

    LG,
    dioskur



  • dioskur schrieb:

    Also ich rufe quasi den Konstruktor aus der Childklasse auf, welcher wiederum den Konstruktor aus der Basisklasse aufruft aber somit womöglich ein Objekt des Typs Parent macht statt Child!?

    der konstruktor der parent klasse ist tatsächlich dafür zuständig, ein objekt der klasse parent zu erstellen (initialisieren) - da child von parent ableitet, setzt du die beiden in eine "ist-ein" beziehung: child ist-ein parent. damit child aber (auch) ein parent sein kann, muss zunächst ein parent-objekt erstellt werden. zu dem zeitpunkt, zu dem dein parent-objekt erzeugt wird, gibt es aber noch kein (fertiges) child-objekt, d.h. etwaige virtuelle methoden werden auch (noch) nicht überschrieben.

    du musst die aufgabe der initialisierung des childs (via SetInput) also auch das child übernehmen lassen (wie auch immer du das implementierst).



  • solang der Konstruktor der Basisklasse abgearbeitet wird, ist das Child-Objekt noch nicht vollständig. Deshalb wird der Aufruf einer virtuellen Funktion auch nur die entsprechende Funktion der Basisklasse aufrufen - im Parent-Ctor IST das Objekt eben noch ein Parent-Objekt.


Log in to reply