- •8. Множественное наследование
- •Добавляем сериализацию...
- •Множественное наследование
- •Множественное наследование
- •Пример
- •Возможная реализация
- •Возможная реализация
- •"Ромбовидное" наследование
- •Пример
- •Пример
- •Пример
- •Виртуальное наследование
- •Улучшенный пример
- •Улучшенный пример
- •Улучшенный пример
Виртуальное наследование
Виртуальноенаследованиепозволяет объединитьнесколькокопий состоянияиповедение, унаследованныхотобщегопредка,в одну.
Базовыйкласс,которыйнаследуется суперклассами,используемымив множественномнаследованиидолжен
бытьунаследовансключевымсловом 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
Созданиекласса,реализующего несколькоинтерфейсов
Одновременнообаслучая
Главное:избегать"ромбовидного" наследования
Множественноенаследованиев другихязыкахООП
Внекоторыхсовременныхязыках программированиямножественное наследованиеклассовзапрещенои заменяетсямножественным интерфейснымнаследованием
◦Порождаемый класс может наследоваться только отодногобазового класса и реализовывать несколько интерфейсов
Спасибозавнимание!