Aufruf virtueller Funktionen im Konstruktor



  • Hallo zusammen,

    mir ist klar, dass bei einem Funktionsaufruf im Konstruktor, die vtable
    für erbende Klassen noch nicht vollständig initialisiert ist, so dass die Methoden
    der aktuellen Klasse aufgerufen werden.

    Als Beispiel:
    Ich habe eine Fensterklasse MyWindow mit einer Methode

    virtual const std::string& getWindowTitle();
    

    Diese Methode wird im Konstruktor aufgerufen.
    In Klassen, die von MyWindow erben, wird (verständlicherweise) nicht
    die überschriebene Methode aufgerufen, so dass mein Fenster-Titel nicht stimmt.

    Wie geht ihr in solchen Fällen vor?
    Eine init-Funktion nach dem Konstruktor aufrufen, finde ich eigentlich blöd.
    Gibt es da einen anderen Workaround?

    Gruß,
    CSpille



  • Ich mache eine init() Funktion und eine Factory, welche sicherstellt, dass init() aufgerufen wird.
    Simon



  • theta schrieb:

    Ich mache eine init() Funktion und eine Factory, welche sicherstellt, dass init() aufgerufen wird.
    Simon

    Dito. Eine Abart davon ist ein sog. "virtueller Konstruktor", der aber im grunde auch nichts anderes macht.



  • Merci!



  • Wobei sich die Frage stellt, warum getWindowTitle ueberhaupt virtuell sein sollte.



  • Wobei sich mir die Frage stellt, woher SomeSubclass::getWindowTitle() denn den Titel hat. Wir sind ja immerhin erst im Ctor. Ist es ein Parameter des Ctors der Unterklasse? Und wäre es dann nicht besser, wenn die Unterklasse innerhalb ihres Ctors setWindowTitle() aufrufen würde?

    Kurz: Mir ist jedes Design suspekt, das einen zwingt, über solche Dinge nachzudenken.

    Stefan.



  • knivil schrieb:

    Wobei sich die Frage stellt, warum getWindowTitle ueberhaupt virtuell sein sollte.

    hmm... Ich verstehe nicht ganz, was du meinst...
    Wie soll man es denn sonst machen? Als Template? Als Parameter, obwohl
    das abgeleitete Fenster immer den gleichen Titel hat?

    DStefan schrieb:

    Kurz: Mir ist jedes Design suspekt, das einen zwingt, über solche Dinge nachzudenken.

    Wie willst du es denn machen? Als Parameter an den Konstruktor übergeben?
    Der Titel ist statisch. Einmal habe ich ein Fenster um mir etwas generell anzukucken
    und das davon ableitende Fenster ist um etwas genauer zu analysieren. Der Fenster-
    Titel war nur das einfachere Beispiel, aber analog mache ich das auch für:

    MyWidget* createInfoWidget();
    

    Hier kommt ein Parameter wohl nicht mehr in Frage.

    Gruß,
    CSpille



  • Wie soll man es denn sonst machen?

    Ich kenne dein Problem nicht, also das uebergeordnete. Wie sollte ich dir da helfen koennen? Btw. Wenn der Titel statisch ist, kannst du ihn auch const und public machen.


Anmelden zum Antworten