Рассмотрим следующее:
В X.h:
class X
{
X();
virtual ~X();
};
x.cpp:
#include "X.h"
X::X()
{}
Попробуйте создать это (я использую цель .dll, чтобы избежать ошибки в отсутствующем главном, и я использую Visual Studio 2010):
Ошибка 1 ошибка LNK2001: неразрешенный внешний символ "private: virtual __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
};
Что вызывает нерешенную внешнюю ссылку в компоновщике, когда виртуальный диск является виртуальным или когда документ не встроен?
EDIT:
Или, возможно, более интересно, почему я не получаю нерешенную внешность, если я делаю деструктор не виртуальным, или если я встраиваю конструктор?