0

これらの各クラスは、個別のdllモジュールにあります。

class Base
{
public:
  virtual void foo();
  void bar();
};


class Derived : public Base
{
public:
  // override Base::foo()
  void foo();
};

Other.cppの場合:

#include "Derived.h"

Base.libとの派生リンクを含むモジュール(エクスポート/インポートディレクティブは表示されていません)。Other.cppを含むモジュールはDerived.libとリンクしていますが、Base.libはリンクしていません。この時点まで、すべてが正常に機能します。

ただし、Base :: bar()を仮想に変更し、Derivedに変更を加えない場合、リンカーはOther.dllをリンクするときに文句を言います。

Other.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Base::bar()" ...

私が見つけた唯一の解決策は、DerivedのBase :: bar()をオーバーライドするか、Other.dllもBase.libとリンクすることです。サーバーが変更されたときにクライアント要件が追加されるため、どちらのソリューションも望ましくありません。

このシナリオで基本クラスの仮想メソッドにアクセス/定義するためのより良い方法に関するアイデアはありますか?

4

1 に答える 1

2

何が起こっているかというとvirtual Base::bar、それは Derived の vtable にある必要があるということDerived::barです。

「サーバーが変更されたときのクライアント要件」についてのコメントがわかりません。ベース/派生がクライアント/サーバーにどのようにマップされるかわかりません。それらは私にとって 2 つの独立した次元です。

于 2010-06-15T14:42:52.043 に答える