plustreeの日記: 謎の挙動
良くあるように、「インタフェース」と「クラス」を分けて、とあるクラスを定義する。
class INTERFACE1
{
};
class PUBLIC_CLASS1 : public INTERFACE1
{
};
もう一通りインタフェースとクラスを分けて定義するが、こちらは上記のインタフェース/クラスを返すメソッドも定義する。
class INTERFACE2
{
public:
virtual INTERFACE1 *f() = 0;
};
class PUBLIC_CLASS2 : public INTERFACE2
{
public:
virtual PUBLIC_CLASS1 *f();
};
ここまでは何の問題もない。
続いて、PUBLIC_CLASS2 の実体は隠蔽したいなあと思い、さらに派生させて
class PUBLIC_CLASS2 : public INTERFACE2
{
public:
virtual PUBLIC_CLASS1 *f() = 0;
};
class IMPLEMENT_CLASS2 : public PUBLIC_CLASS2
{
public:
virtual PUBLIC_CLASS1 *f();
};
としてみる。これも問題ない。
ちなみに、クラスは DLL でエクスポートしたいので、
class __declspec(dllexport) INTERFACE2
{
public:
virtual INTERFACE1 *f() = 0;
};
class __declspec(dllexport) PUBLIC_CLASS2 : public INTERFACE2
{
public:
virtual PUBLIC_CLASS1 *f() = 0;
};
としておく。これもOK。
と・こ・ろ・が、である。
ちょっと PUBLIC_CLASS1 に手を加え、別のクラス X を使って
class PUBLIC_CLASS1 : public X, public INTERFACE1
{
};
とした瞬間、事態は起こる。
main.obj : error LNK2001: 外部シンボル ""public: virtual class PUBLIC_CLASS1 * __thiscall PUBLIC_CLASS2::f(void)" (?f@PUBLIC_CLASS2@@UAEPAVPUBLIC_CLASS1@@XZ)" は未解決です。
なんやそら…。