Aufruf virtueller Methode in Basiskonstruktor



  • In C# geht das übrigens und ist ein wahrer Albtraum. Der von KasF verlinkte Artikel sagt: "That would be a non-stop ticket to undefined behavior and late-night debugging sessions."

    Und ich kann aus eigener Erfahrung sagen: Das mit den late-night debugging sessions ist wahr. 😞


  • Administrator

    KasF schrieb:

    Hi,
    gaaanz wichtige Regel, die du dir merken solltest 🙂
    http://www.artima.com/cppsource/nevercall.html

    Das macht nach den C++-Regeln durchaus Sinn ^^
    Effective C++ kommt bei meiner Bücherreihe aber erst nach ein paar anderen noch anstehenden Büchern. Ach mist ^^

    Aber eine Lösung zu meinem Problem gibt es meiner Meinung nach. Wenn die Initialisierungsliste von CDerived durchlaufen ist, so existiert CDerived doch und der Typ des Objekts ist dann auch CDerived. Im Body des CDerived Konstruktors könnte ich dann doch TestIt aufrufen, dass sollte doch eigentlich gehen.

    #include <iostream>
    
    class CBase
    {
    public:
        CBase()
        {
        }
    
        virtual void TestIt() { std::cout << "CBase::TestIt" << std::endl; };
    };
    
    class CDerived : public CBase
    {
    public:
        CDerived()
            : CBase()
        {
            TestIt();
        }
    
        virtual void TestIt() { std::cout << "CDerived::TestIt" << std::endl; };
    };
    
    int main()
    {
        CDerived* pD = new CDerived();
        delete pD;
    }
    

    Das einzige Problem ist dann wohl, wenn man von CDerived erbt und TestIt überschreibt. Aber CDerived ist eine endgültige Klasse, zumindest bis anhin. Ach mist! Das nervt jetzt!

    Aber vielen Dank für die Hilfe!

    Grüssli



  • Dravere schrieb:

    Effective C++ kommt bei meiner Bücherreihe aber erst nach ein paar anderen noch anstehenden Büchern.

    Ich kann nur raten die Priorität für dieses Buch (das es sowohl in Deutsch als auch Englisch gibt) hochzusetzen. Imho eines der wichtigsten Bücher, und selbst wenn nicht alles darin nur auf Grundwissen von C++ aufbaut, so kann man doch einiges bereits früh verstehen und anwenden (zumindest ist das meine Meinung, auch wenn ich das Buch erst ca. 4-5 Jahre nach meinen C++ Einstieg angeschafft habe).

    cu André



  • Dravere schrieb:

    Aber eine Lösung zu meinem Problem gibt es meiner Meinung nach. Wenn die Initialisierungsliste von CDerived durchlaufen ist, so existiert CDerived doch und der Typ des Objekts ist dann auch CDerived. Im Body des CDerived Konstruktors könnte ich dann doch TestIt aufrufen, dass sollte doch eigentlich gehen.

    Ja, dieses Minimalbeispiel funktioniert nach deiner Anpassung, aber ob das wirklich das ursprüngliche Problem löst, ist die andere Frage. (besonders muß dabei jede von CBase abgeleitete Klasse daran denken, TestIt() aufzurufen - und im produktiven Code macht es wenig Sinn, wenn CDerived keine Geschwister bekommt)


  • Administrator

    Ja, es hat mir auch nicht gefallen. Ich habe es jetzt komplett aus dem Konstruktor genommen. Biete dafür jetzt globale Funktionen an, welche ein entsprechendes Objekt anlegen und danach die Anpassungen durchführen. Grundsätzlich müssen nur ein paar Setter aufgerufen werden. Durch die globalen Funktionen wird nun sichergestellt, dass alles korrekt aufgerufen wird. Aber man könnte es auch ohne die Funktionen machen.

    Naja, jedenfalls vielen Dank. Jetzt sind alle mir bekannten Fehler behoben und es kann in die nächste Testphase gehen.

    Grüssli



  • asc schrieb:

    Dravere schrieb:

    Effective C++ kommt bei meiner Bücherreihe aber erst nach ein paar anderen noch anstehenden Büchern.

    Ich kann nur raten die Priorität für dieses Buch (das es sowohl in Deutsch als auch Englisch gibt) hochzusetzen. Imho eines der wichtigsten Bücher, und selbst wenn nicht alles darin nur auf Grundwissen von C++ aufbaut, so kann man doch einiges bereits früh verstehen und anwenden (zumindest ist das meine Meinung, auch wenn ich das Buch erst ca. 4-5 Jahre nach meinen C++ Einstieg angeschafft habe).

    cu André

    Die Buchreihe (effective C++, more effective C++ und evtl. auch effective STL) sollten sehr weit oben auf der Liste stehen, vielleicht direkt nach einer guten Sprachreferenz. Dazu veilleicht noch eine Prise Gang-of-Four Design Patterns und Pragmatic Programmer. Derartiges sollte auf jeden Fall dran sein bevor man sich auf irgendwelchen Details wie GUI-Programmierung oder aehnliches stuerzt 😉


  • Administrator

    pumuckl schrieb:

    asc schrieb:

    Dravere schrieb:

    Effective C++ kommt bei meiner Bücherreihe aber erst nach ein paar anderen noch anstehenden Büchern.

    Ich kann nur raten die Priorität für dieses Buch (das es sowohl in Deutsch als auch Englisch gibt) hochzusetzen. Imho eines der wichtigsten Bücher, und selbst wenn nicht alles darin nur auf Grundwissen von C++ aufbaut, so kann man doch einiges bereits früh verstehen und anwenden (zumindest ist das meine Meinung, auch wenn ich das Buch erst ca. 4-5 Jahre nach meinen C++ Einstieg angeschafft habe).

    cu André

    Die Buchreihe (effective C++, more effective C++ und evtl. auch effective STL) sollten sehr weit oben auf der Liste stehen, vielleicht direkt nach einer guten Sprachreferenz. Dazu veilleicht noch eine Prise Gang-of-Four Design Patterns und Pragmatic Programmer. Derartiges sollte auf jeden Fall dran sein bevor man sich auf irgendwelchen Details wie GUI-Programmierung oder aehnliches stuerzt 😉

    Gut, denn derzeit will ich noch das Buch (Bible? ^^) von Bjarn Stroustrupp (wie spricht man das eigentlich aus :D) fertig lesen. Danach kommt entweder Objektorientierte Programmierung für Dummies oder C++ Templates The complete Guide. Und dazwischen kommen noch irgendwelche Fantasy Romane, womöglich noch ein PHP-Buch ... ah und mein DirectX-Buch will ich ja auch noch fertig lesen. Und dabei muss ich noch programmieren, kein Wunder das ich momentan gar keine Lust habe zu lesen 😃 🤡
    Ich brauch ein weiteres komplett anderes Ablenkungshobby 😉

    Grüssli



  • Dravere schrieb:

    Gut, denn derzeit will ich noch das Buch (Bible? ^^) von Bjarn Stroustrupp (wie spricht man das eigentlich aus :D) fertig lesen.

    also ich sag stuss-trupp 😃



  • Dravere schrieb:

    Gut, denn derzeit will ich noch das Buch (Bible? ^^) von Bjarn Stroustrupp (wie spricht man das eigentlich aus :D) fertig lesen.

    http://www.research.att.com/~bs/bs_faq.html#pronounce



  • eventuell waere ein functor den man kontrolliert an den c-tor der basisklasse (weiter)gibt das gewuenschte.


  • Administrator

    HumeSikkins schrieb:

    http://www.research.att.com/~bs/bs_faq.html#pronounce

    LoL? Dazu gibt ein ein FAQ Eintrag. Wieviele haben sich wohl diese Frage schon gestellt, bzw. ihm? ^^

    rapso schrieb:

    eventuell waere ein functor den man kontrolliert an den c-tor der basisklasse (weiter)gibt das gewuenschte.

    Glaube ich nicht. Denn als ich mein Code nochmals angeschaut habe, habe ich gemerkt, dass es sehr sinnvoll war, dass meine virtuelle Funktion "nicht richtig" aufgerufen wurde. Wäre sie es nämlich, so hätte bald einmal in einen Bereich geschrieben werden können, der noch gar nicht initialisiert war. Das hätte wohl noch viel "lustigere" Konsequenzen gehabt.

    Grüssli



  • Dravere schrieb:

    Gut, denn derzeit will ich noch das Buch (Bible? ^^) von Bjarn Stroustrupp (wie spricht man das eigentlich aus :D) fertig lesen. Danach kommt entweder Objektorientierte Programmierung für Dummies oder C++ Templates The complete Guide.

    Also wenn du OOP fuer Dummies noch vor dir hast, solltest du das dem Templates Guide vorziehen, der Guide ist naemlich auch wenn man glaubt sich einigermassen in OOP auszukennen ein ganz schoener Brocken (bin fast durch und werd ihn mir wohl noch mehrmals antun muessen um Einzelheiten zu verinnerlichen).



  • Um mal wieder auf das eigentliche Thema zurückzukommen: Gibt es denn überhaupt praktisch relevante Problemstellungen, in denen der Ctor eine virtuelle Methode der endgültigen Klasse aufrufen muß? Oder geht es hier eher um akademische Beispiele?



  • CStoll schrieb:

    Um mal wieder auf das eigentliche Thema zurückzukommen: Gibt es denn überhaupt praktisch relevante Problemstellungen, in denen der Ctor eine virtuelle Methode der endgültigen Klasse aufrufen muß?

    Gibt es. Such mal in comp.lang.c++.moderated, da hatte kein geringerer als Scott Meyers mal diesbezüglich nach Lösungsideen gesucht.
    Wobei "muss" natürlich ein bischen übertrieben ist, denn müssen muss man eigentlich nie 😉

    Link: http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/ab1a749b744e6601/102ec8866338832f?lnk=gst&q="scott+meyers"+%2B+virtual&rnum=8#102ec8866338832f


Anmelden zum Antworten