Почему этот виртуальный деструктор вызывает нерешенное внешнее?
Учтите следующее:
В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 не встроен?
РЕДАКТИРОВАТЬ:
Или, возможно, более интересно, почему яне получить неразрешенное внешнее, если я сделаю деструктор не виртуальным, или если я встроу конструктор?