Это наша идеальная иерархия наследования:
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
дважды, и, таким образом, компилятор будет жаловаться на двусмысленные ссылки на любые члены Foobar
.
Позвольте мне объяснить, почему я хочу такую сложную модель. Это связано с тем, что мы хотим иметь одну и ту же переменную, доступную из WindowsFoobar
, UnixFoobar
, FoobarClient
и FoobarServer
. Это не будет проблемой, только я хотел бы использовать множественное наследование с любой комбинацией выше, чтобы я мог использовать функцию server/client на любой платформе, а также использовать функцию платформы на любом клиенте или сервере.
Я не могу не почувствовать, что это несколько распространенная проблема с множественным наследованием... Подхожу ли я к этой проблеме из-за неправильного угла?
Обновление 1:
Кроме того, подумайте, что мы могли бы использовать #ifdef
, чтобы обойти это, однако это будет приводить к очень уродливому коду, подобному такому:
CFoobar::CFoobar()
#if SYSAPI_WIN32
: m_someData(1234)
#endif
{
}
... yuck!
Обновление 2:
Для тех, кто хочет больше читать на фоне этой проблемы, я действительно предлагаю скинуть над список рассылки. Вещь начинает интересна вокруг 3-го поста. Также существует связанный код commit, с помощью которого вы можете увидеть настоящий код жизни, о котором идет речь здесь.