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

Виртуальное наследование

Виртуальноенаследованиепозволяет объединитьнесколькокопий состоянияиповедение, унаследованныхотобщегопредка,в одну.

Базовыйкласс,которыйнаследуется суперклассами,используемымив множественномнаследованиидолжен

бытьунаследовансключевымсловом virtual.

Улучшенный пример

//...

//Млекопитающее

class Mammal :

public virtual Animal { public:

virtual void FeedWithMilk(){} void Eat() { FeedWithMilk(); } };

Улучшенный пример

// Животное с крыльями

class WingedAnimal: public virtual Animal {

public:

virtual void Fly(){}

//Eat() не переопределяем!

//см. далее

};

Улучшенный пример

int main(int argc, char * argv[])

{

Bat bat;

// Теперь нормально bat.Eat();

return 0;

}

Ограничениявиртуального наследования

Классы,являющиесяпредкамипри порожденииподклассаспомощью виртуальногонаследованиянемогут переопределятьодниитежеметоды своегородителя.

Внашемпримере:еслиMammal и WingedAnimal переопределят

одновременнометодEat,мы получим ошибкукомпиляции.

Водномклассепредупреждение.

Областьприменения множественногонаследования

Созданиекласса,использующего несколькореализаций

Широкоиспользуется вбиблиотеках ATL и WTL

Созданиекласса,реализующего несколькоинтерфейсов

Одновременнообаслучая

Главное:избегать"ромбовидного" наследования

Множественноенаследованиев другихязыкахООП

Внекоторыхсовременныхязыках программированиямножественное наследованиеклассовзапрещенои заменяетсямножественным интерфейснымнаследованием

Порождаемый класс может наследоваться только отодногобазового класса и реализовывать несколько интерфейсов

Спасибозавнимание!

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