Por que esse destruidor virtual aciona um externo não resolvido?
Considere o seguinte:
NoX.h:
class X
{
X();
virtual ~X();
};
X.cpp:
#include "X.h"
X::X()
{}
Tente criar isso (estou usando um destino .dll para evitar um erro no principal ausente e usando o Visual Studio 2010):
Erro 1 erro LNK2001: símbolo externo não resolvido "private: __thiscall virtual X :: ~ X (void)" (?? 1X @@ EAE @ XZ)
Pequenas modificações resultam em uma compilação bem-sucedida, no entanto:
X.h:
class X
{
inline X(); // Now inlined, and everything builds
virtual ~X();
};
ou
X.h:
class X
{
X();
~X(); // No longer virtual, and everything builds
};
O que causa o externo não resolvido no vinculador quando o .dtor é virtual ou quando o .ctor não está embutido?
EDITAR:
Ou, talvez mais interessante, por que eunão obter um externo não resolvido se eu tornar o destruidor não virtual ou se eu embutir o construtor?