Множественное наследование для решения абстрактных классов

Скажем, у меня 4 класса:

class I { public: virtual void X() = 0; };
class A : public virtual I { public: virtual void X() { } };
class B : public I {  };
class C : public A, public B { };

I, Bи Cявляются абстрактными, а A— нет. Если я просто добавлю virtualк наследованию Iдля B, тогда A::X()разрешает I::X()в C.

Однако я не могу изменить источник B.

Мой вопрос:Могу ли я заставить A::X()разрешить I::Xдля Cбез возможности изменить B? Я пытался объявить Aи Bвиртуальными для C, но безрезультатно. Я пытаюсь не иметь избыточного кода (, например. пусть C объявляет X (){ A ::X (); } ). Любые аккуратные хаки?

Также -есть несколько вопросов, очень похожих на этот, но я не нашел ни одного разговора об использовании virtualнаследования. Пожалуйста, укажите мне один, если я пропустил его.

6
задан i_am_jorf 6 July 2012 в 17:30
поделиться