Pure virtual Destructor -> Linker Error



  • Hoi,
    bin nicht mehr 100% fit in C++ und ärgere mich gerade fürchterlich über einen Linkerfehler. 😉

    Das habe ich deklariert:

    class SharedLibrary {
       public:
          virtual ~SharedLibrary() = 0;
          virtual void* getSymbol(char const* name) = 0;
       };
       typedef std::shared_ptr<SharedLibrary> SharedLibraryPtr;
    
       SharedLibraryPtr loadSharedLibrary(char const* path);
    

    Der Linker straft mich wie folgt ab:

    undefined reference to `ed::SharedLibrary::~SharedLibrary()'
    

    Wie kommt er darauf, was übersehe ich?

    Danke schon mal & schöne Grüße,
    Ethon



  • Destruktor muss immer implementiert werden, auch wenn pure virtual.



  • out schrieb:

    Destruktor muss immer implementiert werden, auch wenn pure virtual.

    Danke!

    Weiß jemand warum? Finde das herzlich sinnfrei. 😕



  • Ethon schrieb:

    out schrieb:

    Destruktor muss immer implementiert werden, auch wenn pure virtual.

    Danke!

    Weiß jemand warum? Finde das herzlich sinnfrei. 😕

    Naja, der Destruktor der abgeleiteten Klasse ruft den der Basisklasse auf, dann muss halt was zum Aufrufen da sein.

    Natürlich kannst du die Implementation des Destruktors weglassen, dann kannst du aber auch niemals ein Objekt einer abgeleiteten Klasse erstellen, also sinnlos.



  • Weil der nach dem Destruktor der abgeleiteten Klasse aufgerufen wird.



  • class SharedLibrary {
       public:
          virtual ~SharedLibrary() = 0 {};
          virtual void* getSymbol(char const* name) = 0;
       };
       typedef std::shared_ptr<SharedLibrary> SharedLibraryPtr;
    
       SharedLibraryPtr loadSharedLibrary(char const* path);
    

    geht

    was ich eigentlich auch gar nicht schlecht finde, wenn man sowas schreibt


  • Mod

    @MrLong: Ne, ist Quatsch. Wird auch im Standard explizit in einer Notiz angesprochen:

    [class.abstract]/2 schrieb:

    [ Note: A function declaration cannot provide both a pure-specifier and a definition — end note ] [ Example:

    struct C {
      virtual void f() = 0 { }; // ill-formed
    };
    

    — end example ]



  • Ahjo, das mit der Destruktor-Chain macht Sinn, daran habe ich nicht gedacht, danke. 🙂

    Ich habe es einfach gegen default ausgetauscht und gut.



  • ok dann ist das wohl ne MS Extension - wieder was gelernt.


Anmelden zum Antworten