"Ромбовидное" наследование
Animal
+Eat()
Mammal WingedAnimal
+FeedWithMilk() +Fly()
Пример
class Animal { public:
virtual void Eat() {};
};
class Mammal : public Animal { public:
virtual void FeedWithMilk(){} void Eat() { FeedWithMilk(); } };
Пример
class WingedAnimal:public Animal { public:
virtual void Fly(){} void Eat() {}
};
class Bat : public Mammal, public WingedAnimal
{
/* Реализация здесь */ };
Пример
int main(int argc, char * argv[]){ Bat bat;
//error:ambiguous access of 'Eat'
//bat.Eat();
//мышь есть как млекопитающее? bat.Mammal::Eat();
//или как крылатое животное? bat.WingedAnimal::Eat();
return 0;
}
Возможноерешение: виртуальноенаследование
Проблемаромбовидного наследованиязаключаетсявтом,что классBat содержитв себедвекопии данныхиметодовклассаAnimal
◦Копия, унаследованная отMammal
◦Копия, унаследованная отWingedAnimal
Врядеслучаевподобныепроблемы неоднозначностиустраняютсяпутём использованиявиртуального
наследования