Существует ошибка компиляции "'A' является неоднозначной базой 'C'", существующей в тесте diamond multiple inheritance
ниже,
struct A { void f();};
struct B1: A {};
struct B2: A {};
struct C: B1, B2 {};
void g() {A *o = new C;}
Она решается с помощью virtual inheritance
ниже,
struct B1: virtual A {};
struct B2: virtual A {};
Теперь есть ошибка компиляции "нет уникального окончательного переопределения для 'virtual void A :: f ()' в 'C'", существующего в другом тесте diamond multiple polymorphism
ниже,
struct A {virtual void f();};
struct B1: virtual A {void f();};
struct B2: virtual A {void f();};
struct C: B1, B2 {};
void g() {
A *o = new C;
o->f();
}
Иона не может быть решена даже с помощью dynamic_cast
ниже,
dynamic_cast<B1 *>(o)->f();
@ NOTE
dynamic_cast<T *>(obj_ptr)
фактически используется для выполнения typesafe downcast
, то есть когдатип времени выполнения Tobj объекта, на который указывает obj_ptr, является подтипом T, он возвращает сам obj_ptr;в противном случае указатель NULL.Ошибочно думать, что преобразование подтипа Tobj в супертип T приводит к обратному выводу, иначе выполнение upcast во время выполнения прямо противоречит принципу полиморфизма.
IMHO, virtual inheritance
достаточно кратко для решения проблемы первой половиныво время компиляции.Напротив, можете ли вы представить что-нибудь, чтобы решить проблему второй половины во время выполнения?
@ EDIT
Спасибо за ваше указание dynamic_cast
несделать работу.Исправлено.
Чтобы решить проблему 2-й половины, кажется, что у него нет выбора, кроме как реализовать переопределение в последнем подклассе иерархии алмазов ниже,
struct C: B1, B2 {
void f() {B1::f();} //Hardcode to your choice of overrider
};