これが理想的な継承階層です。
class Foobar;
class FoobarClient : Foobar;
class FoobarServer : Foobar;
class WindowsFoobar : Foobar;
class UnixFoobar : Foobar;
class WindowsFoobarClient : WindowsFoobar, FoobarClient;
class WindowsFoobarServer : WindowsFoobar, FoobarServer;
class UnixFoobarClient : UnixFoobar, FoobarClient;
class UnixFoobarServer : UnixFoobar, FoobarServer;
これは、継承階層がFoobar
2 回から継承しようとするためであり、そのため、コンパイラは のメンバーに対するあいまいな参照について不平を言うからですFoobar
。
どうしてこんなに複雑なモデルが必要なのか説明させてください。これは、 、 、 、および から同じ変数にアクセスできるようにWindowsFoobar
するUnixFoobar
ためFoobarClient
ですFoobarServer
。これは問題にはなりませんが、任意のプラットフォームでサーバー/クライアント関数を使用し、クライアントまたはサーバーでプラットフォーム関数を使用できるように、上記の任意の組み合わせで多重継承を使用したいだけです。
これは多重継承のやや一般的な問題だと感じずにはいられません...私はこの問題に完全に間違った角度から取り組んでいますか?
更新 1:
また、#ifdef
これを回避するために使用できることを考慮してください。ただし、これは次のような非常に醜いコードを生成する傾向があります。
CFoobar::CFoobar()
#if SYSAPI_WIN32
: m_someData(1234)
#endif
{
}
...うん!
更新 2:
この問題の背景をもっと読みたい人は、該当するメーリング リストのスレッドに目を通すことを強くお勧めします。3回目の投稿あたりから面白くなり始めます。また、問題の実際のコードをここで確認できる関連コード コミットもあります。