¿Por qué este destructor virtual desencadena un externo no resuelto?
Considera lo siguiente:
EnX.h:
class X
{
X();
virtual ~X();
};
X.cpp:
#include "X.h"
X::X()
{}
Intente compilar esto (estoy usando un destino .dll para evitar un error en el main faltante, y estoy usando Visual Studio 2010):
Error 1 error LNK2001: símbolo externo sin resolver "privado: virtual __thiscall X :: ~ X (nulo)" (?? 1X @@ EAE @ XZ)
Pequeñas modificaciones resultan en una compilación exitosa, sin embargo:
X.h:
class X
{
inline X(); // Now inlined, and everything builds
virtual ~X();
};
o
X.h:
class X
{
X();
~X(); // No longer virtual, and everything builds
};
¿Qué causa el externo no resuelto en el enlazador cuando el .dtor es virtual o cuando el .ctor no está en línea?
EDITAR:
O, quizás más interesante, ¿por quéno obtener un externo no resuelto si hago que el destructor no sea virtual o si alineo el constructor?