Segmentation fault bei virtuellem Funktionsaufruf



  • Hallo!

    Folgendes Problem: ich habe einige Klassen, die alle eine gemeinsame Basisklasse haben, einige Funktionen sind virtuell.
    So hat die Klasse Parser zb. die Funktionen write() und setFinished(), wobei nur setFinished virtual deklariert ist.
    Die Klassen TableParser und BoolParser reimplementieren die virtuelle Funktion setFinished() .
    Nun wird ein Zeiger auf eine Klasse vom Typ Parser auf eine TableParser oder BoolParser Klasse gesetzt.

    Der Aufruf nicht-virtueller Funktionen klappt, rufe ich eine virtuelle Funktion auf bricht das Programm ab. Woran kann das liegen?
    Das Ganze ist in QT, die Klassen erben jeweils von QObject, kann mir aber nicht vorstellen, dass das etwas damit zu tun hat, deswegen auch dieses Forum.

    Vielen Dank!

    Flo



  • zeig mal ein paar aussagekräftige teile deines codes...



  • naja da gibts eigentlich nix nennenswertes

    da brauche ich ja imo kein virtual:

    class TableParser : public Parser
    

    und dann habe ich eben die deklarationen
    Basisklasse:

    virtual void setFinished();
    

    Überladen:

    virtual void setFinished();
    

    ... sind identisch, genau so wie es sein sollte....

    und bei der definition brauche ich ja kein virtual, also habe ich einfach so gemacht:

    void TableParser::finished() {
    

    bzw.

    void Parser::finished() {
    

    und der eigentliche Funktionsaufruf läuft über

    Parser * parser = new TableParser;
    parser->setFinished();
    

    das ist mir echt ein rätsel, warum nix funktioniert, ich probiere schon seit 2 stunden rum....

    flo



  • flofloflo schrieb:

    Der Aufruf nicht-virtueller Funktionen klappt, rufe ich eine virtuelle Funktion auf bricht das Programm ab. Woran kann das liegen?

    Die einzige Stelle wo virtuelle Funktionen Fehler verursachen sollten, sofern die Implementierung als solche stimmt:

    a) Anwendung auf ein nicht vorhandenes Objekt (z.B. Pointerzuweisung einer temporären Variable)
    b) Slicing (such hierzu einfach mal), Kurzzusammengefasst: wenn man den abgeleiteten Teil "abschneidet"
    c) Direkt oder indiekte virtuelle Funktionsaufrufe aus Konstruktoren heraus (Da immer von der Basis zur Ableitung hin konstruiert wird).

    cu André



  • flofloflo schrieb:

    naja da gibts eigentlich nix nennenswertes...

    Vor allem sind die Codeausschnitte die du uns zeigst so kurz das es wirklich nicht Nennenswert für eine Aussage zum Fehler ist.

    Edit: Deinen letzten zwei Zeilen nach schließe ich aber 1/2/3 aus, und sage Fehler in der Implementierung. Bitte nutze den Debugger, und prüfe wo genau der Absturz kommt.

    cu André



  • oops... ich bin ein idiot
    entschuldigt dass ich eure zeit in anspruch genommen habe.

    if(parser = 0)
    


  • flofloflo schrieb:

    oops... ich bin ein idiot
    entschuldigt dass ich eure zeit in anspruch genommen habe.

    if(parser = 0)
    

    Ein guter Compiler sollte dir hier aber eine Warnung geben (Schau mal nach ob man die Warnstufe erhöhen kann, in MSVC z.B. in den Projekteinstellungen unter gcc glaube ich -wall...).

    cu André


Anmelden zum Antworten