次のようなパブリック インターフェイスの階層があります。
struct ISwitchable {
/* Obtain pointer to another implemented interface of the same instance. */
virtual int switch(unsigned int interfaceId, void** pInstance) = 0;
};
struct IFoo : public ISwitchable { /* Methods */ };
struct IBar : public ISwitchable { /* Methods */ };
struct IFooBar : public IFoo, public IBar { /* Methods */ };
IFooBar を実装するクラスは、ファクトリ関数と共に dll に配置されます。クライアント コードは dll をロードし、ファクトリ関数を使用してクラス インスタンスを作成し、それをインターフェイスに従って使用します (これらはヘッダー ファイルとして提供されます)。
Scheme は、MSVC によって作成された dll と、Borland C++ Builder 6 によって作成されたクライアント コードで正常に動作します。
仮想継承を階層に導入します。
struct IFoo : public virtual ISwitchable { /* Methods */ };
struct IBar : public virtual ISwitchable { /* Methods */ };
そして、同じ状況 (MSVC による dll、Builder によるクライアント) で、クライアント コードがクラスのインスタンスを要求すると、乱雑な vtable でそれを取得します。
通常の継承にロールバックする以外に解決策はありますか?