Аналогично, но не идентично ЭТОМУ ВОПРОСУ :
A
/ \
B C
\ /
D
То, что я хочу, это:
struct A { virtual void func (void) = 0; };
struct B : virtual A { void func (void) {} };
struct C : virtual A { void func (void) {} };
struct D : B,C { void func (void) {} };
int main ()
{
A *p = new D();
((C*) p)->func(); // do C::func
((B*) p)->func(); // do B::func
}
Согласно НАСТОЯЩЕМУ ВОПРОСУ это, похоже, не проблема, поскольку наследование - это просто множественное наследование, а не бриллиант. почему это не работает с ромбовидной формой?
Очевидно, это неоднозначно, но я хочу иметь возможность привести указатель и, следовательно, использовать другую родительскую реализацию виртуальной функции, т. Е .:
((C*) p)->func(); //does C::func
Если я запускаю приведенный выше код, я сталкиваюсь с ошибкой:
error: cannot convert from pointer to base class 'A' to pointer to derived class 'C' because the base is virtual
((C*)p)->func();
которую я пытался гуглить, но нигде не могу найти