pure virtual Methode in Destruktor aufrufen



  • Hallo zusammen,

    folgendes Beispiel:

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
    	virtual ~A() { stop(); }
    
    	virtual void start() = 0;
    	virtual void stop() = 0;
    };
    
    class B : public A
    {
    public:
    	void start() {}
    	void stop() {}
    };
    
    int main() {
    	B b;
    	return 0;
    }
    

    produziert unter VC2008 folgenden Linkerfehler
    "error LNK2001: unresolved external symbol "public: virtual void __thiscall A::stop(void)" (?stop@A@@UAEXXZ)"
    Kann mir jemand sagen, warum das nicht gehen soll?

    Wenn ich dagegen den destructor durch "virtual void test() { stop(); }" ersetze, funktionierts einwandfrei.

    Vielen Dank schonmal...
    C14



  • Objekte werden von aussen nach innen zerstört. Zuerst wird also der Destruktor von B durchlaufen (der noch auf Elemente von A zugreifen darf), dann der von A. Wenn der Destruktor von A durchlaufen wird, existiert der B-Teil des Objekts nicht mehr.

    Da der Compiler dies schon zur Compilezeit weiß, versucht er beim Aufruf der virtuellen Methode nicht, die tatsächliche Implementierung zu finden, sondern ruft (wie bei einer nicht-virtuellen Methode) die Methode in A auf.



  • Zu LordJaxoms Erklärung sei noch hinzuzufügen, dass sowas wie start/init und ähnliche Methoden selten eine gute Idee sind. Ich sage nicht nie ich sage selten. Bevor hier wieder irgendwelche Winkeladvokaten auf irgendeinen seltenen Fall verweisen, den man so lösen könnte...



  • Ahja, macht Sinn, danke für die schnelle Antwort.

    @pumuckl:
    Konkret gings hier aber um ne webcam, die man mit start/stop an- und ausschaltet.
    Das soll man auch manuell machen können um zum Beispiel zwischenzeitlich die webcam auszuschalten.
    Die B-Klassen waren dann konkrete Implementierungen mit unterschiedlichen APIs.
    Wahrscheinlich wärs sinnvoller aber umständlicher die Implementierung als member zu machen?
    Ich mach das stop jetzt eben im destruktor der jeweiligen Implementierung.



  • C14 schrieb:

    @pumuckl:
    Konkret gings hier aber um ne webcam,.

    Einer der Gründe, warum es meist relativ sinnfrei ist, hier "Beispielcode" für ein reales Problem zu posten, statt den relevanten Code einfach nur per Copy & Paste einzustellen - man unterschlägt willkürlich relevante Informationen.


Anmelden zum Antworten