Warum löst dieser virtuelle Destruktor ein ungelöstes externes Objekt aus?

Folgendes berücksichtigen

Im X.h:

class X
{
    X();
    virtual ~X();
};

X.cpp:

#include "X.h"

X::X()
{}

Versuchen Sie, dies zu erstellen (ich verwende ein DLL-Ziel, um einen Fehler auf dem fehlenden Haupt zu vermeiden, und ich verwende Visual Studio 2010):

Error 1 Fehler LNK2001: nicht aufgelöstes externes Symbol "privat: virtuell __thiscall X :: ~ X (void)" (?? 1X @@ EAE @ XZ)

Kleine Änderungen führen jedoch zu einem erfolgreichen Build:

X.h:

class X
{
    inline X(); // Now inlined, and everything builds
    virtual ~X();
};

ode

X.h:

class X
{
    X();
    ~X(); // No longer virtual, and everything builds
};

Was verursacht das nicht aufgelöste externe Element im Linker, wenn das .dtor-Objekt virtuell ist oder wenn das .ctor-Objekt nicht eingebettet ist?

BEARBEITEN

Oder vielleicht interessanter, warum mache ichnich bekomme eine ungelöste externe, wenn ich den Destruktor nicht-virtuell mache oder wenn ich den Konstruktor inline?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage