Почему этот виртуальный деструктор вызывает нерешенное внешнее?

Учтите следующее:

ВX.h:

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

x.cpp:

#include "X.h"

X::X()
{}

Попробуйте построить это (я использую цель .dll, чтобы избежать ошибки на отсутствующем основном, и я использую Visual Studio 2010):

Ошибка 1 ошибка LNK2001: неразрешенный внешний символ «личное: виртуальное __thiscall X :: ~ X (void)» (?? 1X @@ EAE @ XZ)

Небольшие модификации приводят к успешной сборке, однако:

X.h:

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

или же

X.h:

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

Что вызывает неразрешенное внешнее в компоновщике, когда .dtor является виртуальным или когда .ctor не встроен?

РЕДАКТИРОВАТЬ:

Или, возможно, более интересно, почему яне получить неразрешенное внешнее, если я сделаю деструктор не виртуальным, или если я встроу конструктор?

Ответы на вопрос(7)

Ваш ответ на вопрос