virtual verursacht myseriösen Fehler



  • Hey Leute,
    Eine prinzipielle Frage. Wenn ich folgende zwei Klassen habe:

    class A
    {
    
    };
    class B : public A
    {
       public:
        virtual test(void){return 2;}
    };
    

    Und jetzt schreibe:

    A * a = new A();
    a = new B();
    ((B*)a)->test();
    

    So kommt es zu einem Laufzeitfehler.
    Lösche ich das virtual funktioniert alles wie geschmiert. Woran liegt das?

    Liebe Grüße
    David



  • Visual C++ 5.0 ?



  • Nein, in eclipse 🙂 mit Linux



  • Das sollte eigentlich funktionieren. Wobei ich nicht verstehe, wie man so einen Schwachsinn schreiben kann. Der Code ist echt übel.

    Statt A* a kannst Du genauso gut void* a schreiben. Das ist völlig egal. Einen C-Style-Cast sollte man nicht verwenden und ein void in "test(void)" ist mehr als flüssig. Und der Methode fehlt der Rückgabewert. So nebenbei erzeugst Du einen memoryleak, indem Du ein A anlegst und den Zeiger gleich wieder vergisst.

    Hilfreich, wenn nicht gar unbedingt notwendig wäre ein vollständiges compilierbares Beispiel und Angabe zum Compiler und verwendeter Compileoptionen.



  • David777 schrieb:

    Nein, in eclipse 🙂 mit Linux

    Na das ging ja schnell. Leider fehlt die Angabe des verwendeten Compilers. Mit welchem Programm Du das Programm eintippst und den Compiler aufrufst ist für die Problemstellung völlig schnuppe.



  • Das doppelte new sieht sowieso nach Mist aus. Bist du sicher, dass du in deinem Programm als letztes ein 'new B' hast und kein 'new A'?
    (das würde erklären, warum non-virtual klappt/klappen kann - und virtual nicht)


Log in to reply