Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lect08.pdf
Скачиваний:
7
Добавлен:
06.02.2016
Размер:
396.45 Кб
Скачать

"Ромбовидное" наследование

Animal

+Eat()

Mammal WingedAnimal

+FeedWithMilk() +Fly()

Bat

Пример

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

Врядеслучаевподобныепроблемы неоднозначностиустраняютсяпутём использованиявиртуального

наследования

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]