Undefined Reference zu virtuellem Destruktor



  • Hi,

    ich habe folgendes Problem: Ich habe ein Interface IGeneralDevice.hpp, das folgende Methoden enthält:

    virtual ~IGeneralDevice() = 0;
    // Plus zusätzliche Methoden
    

    Jetzt habe ich eine Klasse MatlabDevice, die von dieser Klasse erbt.

    MatlabDevice();
    ~MatlabDevice();
    // Und Deklaration der restlichen Methoden
    

    Hier die Implementierungen in der MatlabDevice.cpp:

    MatlabDevice::MatlabDevice() {
    	simulationStarted = false;
    	setup = false;
    }
    MatlabDevice::~MatlabDevice() {
    }
    // Restliche Implementierungen
    

    Ich bekomme bei beiden Methoden folgenden Fehler: "undefined reference to `IGeneralDevice::~IGeneralDevice()'"

    Kann sich jemand den Fehler erklären? Ich sehe da irgendwie keinen -.-



  • Der Destruktor muss IMMER implementiert werden

    virtual ~IGeneralDevice() = 0 {}
    


  • Ist IGeneralDevice::~IGeneralDevice() denn irgendwo definiert?



  • Hm wo ist denn da der Sinn bei einer rein virtuellen Klasse?

    Wenn ich virtual ~IGeneralDevice() {} hinschreibe bekomme ich einen undefined reference to vtable Fehler. die = 0 { } führt zu einem "reiner Spezifizierer bei Funktionsdefinition" Fehler.



  • virtual ~IGeneralDevice() {}
    


  • Habe doch geschrieben, dass ich damit einen vtable-Fehler bekomme. Das deutet normalerweise daraufhin, dass irgendeine Methode nicht implementiert wurde, oder? Kann aber keine finden..



  • ok danke, hat sich wohl erledigt. Hatte bei den virtuellen Methoden in der Basisklasse das = 0; vergessen..



  • Sorry, das Feature benutze ich auch ziemlich selten.

    class IGeneralDevice{
        virtual ~IGeneralDevice() = 0;
    };
    IGeneralDevice::~IGeneralDevice(){}
    

    GorbGorb schrieb:

    virtual ~IGeneralDevice() {}
    

    das macht nicht das Selbe. Versuch mal in der pure virtual version (wie oben) ein Objekt vom Typ IGeneralDevice zu erzeugen. Du wirst merken, dass das nicht geht. Der rein virtuelle Destruktor in einer Klasse die sonst keine Methoden besitzt bewirkt, dass die Klasse abstrakt wird. Trotzdem muss der Destruktor implementiert sein. Das geht nebenbei bei jeder abstrakten Funktion. Du musst sie überschreiben, aber du kannst eine default implementation anbieten, die in der abgeleiteten Klasse aber explizit gewählt werden muss (mit Basisklasse::methode(...)).



  • der dtor spielt eben eine sonderrolle,da er stets aufgerufen wird,auch wenn er überschrieben wird. Darum muss eben eine Implementierung auch in einer abstrakten Klasse vorliegen.


Anmelden zum Antworten