Zrobiłem sobie eksperyment podczas wielodziedziczenia usuwając przy deklaracjach klas które były dziedziczone słowo kluczowe virtual, które rozwiązywało problem wieloznaczności składowych.
Hierarchia klas wygląda następująco: Klasy Animal() i Human() dziedziczą po klasie Mammal skolei Mammal dziedziczy po klasie abstrakcyjnej Proper, która pełni funkcję interfejsu.
I teraz zaczyna się problem, o ile kiedy Animal i Human były dziedziczone jako klasy virtualne było wszystko OK to teraz wygląda to tak, że nie mogę utworzyć instancji klasy Muntant, która wielodziedziczy po Animal() i Human() :
Mammal* xmen = new Mutant();
Tak nie przejdzie, gdyż dochodzi do wieloznaczności, ok rozwiązałem to przez rzutowanie do jednej z klas Animal() lub Human():
Mammal* xmen = (Animal *)new Mutant();
Jest ok, ale przez to tracę możliwość dostania się bezpośrednio do metod i właściwości zdefiniowanych w Mutant, pozostają tylko te odziedziczone.
No więc aby kompilator się nie burzył zrobiłem kolejne rzutowanie:
dynamic_cast<Mutant *>(xmen)->metodaMutanta()
No cóż jeśli inaczej się tego nie da rozwiązać to nie dziwię się, że wielodziedziczenie w takiej formie nie jest zbytnio dobrze oceniane.
Pozostaje używać wielodziedziczenia wirtualnego albo robić sobie tego typu komplikacje bo innej sytuacji tutaj nie widzę, chodzi o te nieszczęsne rzutowanie na Animal* lub Human* ( czyli klasy o szczebel niżej - tracąc przy tym dostęp do składowych utworzonych o szczebel wyżej ) chyba, że coś przeoczyłem ?