Aufruf in Basisklasse ruft Basis-Methode auf



  • Hallo,
    nach einigem ergebnislosem Suchen und wälzen dutzender Anleitungen zu Vererbung schreibe ich nun mal hier...
    in der Hoffnung, mir kann jemand sagen, warum ein Aufruf in der Basisklasse nicht die überschriebene Methode aufruft...

    erstmal bisschen code:

    Basisklasse (hier wird auch OnCreate aufgerufen):

    class CWindow
    {
      protected:
        virtual void OnCreate();
    ...
    void CWindow::OnCreate()
    {
      cout << "CWindow::OnCreate" << '\n';
    }
    

    diese Klasse überschreibe ich:

    class MyWindow : public CWindow
    {
      protected:
        void OnCreate();
    ...
    void MyWindow::OnCreate()
    {
      cout << "MyWindow::OnCreate" << '\n';
    }
    

    ich erstelle ein Objekt vom Typ MyWindow und die BasisKlasse ruft OnCreate auf...nur leider das eigene, nicht das von MyWindow 😞

    Gruß Frank



  • Im Konstruktor sind die virtuellen Funktionen noch nicht verfügbar.



  • Danke für den Hinweis, genau das war es...
    leider brauche ich jetzt eine separate Methode, um mein Fenster zu erstellen...vorher hat das alles mein Constructor gemacht...

    Gruß Frank



  • Warum eigentlich der Umweg über OnCreate() ? Kannst du die klassenspezifischen Aktionen nicht gleich im jeweiligen Konstruktor ausführen?



  • OnCreate ist meine Ereignismethode,welche ich von der abgeleiteten Klasse mit Code fülle,der nix mit meiner basisklasse zu tun hat (erstellen anderer Controls). OnCreate wird nicht direkt vom constructor aufgerufen sondern über die WM_CREATE-Nachricht. Zu dem Zeitpunkt ist aber noch CreateWindowEx aktiv,welches im Constructor aufgerufen wurde.

    Gruß frank



  • frank schrieb:

    OnCreate ist meine Ereignismethode,welche ich von der abgeleiteten Klasse mit Code fülle,der nix mit meiner basisklasse zu tun hat (erstellen anderer Controls). OnCreate wird nicht direkt vom constructor aufgerufen sondern über die WM_CREATE-Nachricht. Zu dem Zeitpunkt ist aber noch CreateWindowEx aktiv,welches im Constructor aufgerufen wurde.

    Das ist keine Begruendung warum du ein OnCreate() hast.
    Nur weil intern ein WM_CREATE gesendet wird, musst du das nicht 1:1 in deiner Library abbilden.



  • sicherlich mag es mehrere Möglichkeiten geben, ich kenne nur die OnCreate-Methode von Delphi und da war es der optimale platz um dynamisch controls zu erstellen.
    Direkt im Constructor habe ich evtl noch nicht das Window-Handle, welches ich benötige um diese Controls zu erstellen.

    Gruß Frank


Log in to reply