次の点を考慮してください。
Xhで:
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)
ただし、わずかな変更でビルドは成功します。
じ:
class X
{
inline X(); // Now inlined, and everything builds
virtual ~X();
};
また
じ:
class X
{
X();
~X(); // No longer virtual, and everything builds
};
.dtor が仮想の場合、または .ctor がインライン化されていない場合、リンカで未解決の外部が発生する原因は何ですか?
編集:
または、おそらくもっと興味深いことに、デストラクタを非仮想にした場合、またはコンストラクタをインライン化した場合、未解決の外部が得られないのはなぜですか?