2012-04-10 1 views
1

Я изучаю теперь различные ситуации двусмысленности в виртуальном деривации на C++. Но у меня есть ошибка неоднозначности в моем коде, и я не понимаю, что это причина ...виртуальный вывод и преобразование неоднозначный

Вот мой код:

class V { 
    public: 
     int v ; 
}; 

class A { 
    public: 
     int a ; 
}; 

class B : public A, public virtual V { 

}; 

class C : public A, public virtual V { 

}; 

class D : public B, public C { 
    public: 
     void f() ; 
}; 

void g() { 
    D d ; 
    B* pb = &d ; // No Problem 
    A* pa = &d ; // Error: 'A' is ambiguous base of 'D' 
    V* pv = &d ; // No Problem 
} 

Я не понимаю, почему у меня эта ошибка, однако, у меня нет ошибок для других аффектов.

Спасибо :-)

ответ

2

Это вполне ожидаемо в случаях multiple inheritance. Здесь мы имеем дело с наследованием алмазов. D теперь имеет две копии A, одну, унаследованную от B, и одну, унаследованную от C. Вам нужно указать, какой из B или C принадлежит членам A, подвергшимся воздействию D.

См: Using C++, how do I correctly inherit from the same base class twice?

Вы могли бы рассмотреть:

  • Использование виртуального наследования:

    class B : public virtual A, public virtual V {...};

    class C : public virtual A, public virtual V {...};

  • Использование Compositio n как выход из множественного наследования.

Я предлагаю читать Solving the Diamond Problem with Virtual Inheritance

+1

Спасибо. Но оба они унаследованы от А. Итак, в чем проблема с этой аффектацией? Спасибо – Copernic

+0

@Mehdi - D * не может * наследовать два экземпляра A. Подумайте об этом - если A содержит общедоступное свойство «a», то оба B и C имеют свойство «a». Теперь D имеет два свойства «a» - какой должен использовать компилятор? Он не может просто объединить их - это не так просто. Вот почему он не может скомпилировать. – Alain

+0

Aaah. Теперь я понимаю! большое спасибо @Alain :) – Copernic

Смежные вопросы