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 MethodenJetzt habe ich eine Klasse MatlabDevice, die von dieser Klasse erbt.
MatlabDevice(); ~MatlabDevice(); // Und Deklaration der restlichen MethodenHier die Implementierungen in der MatlabDevice.cpp:
MatlabDevice::MatlabDevice() { simulationStarted = false; setup = false; } MatlabDevice::~MatlabDevice() { } // Restliche ImplementierungenIch 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.