РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
698 of 815 menu

Множественное наследование

Множественное наследование - это механизм в C++, при котором один производный класс наследует члены от двух или более базовых классов. В списке наследования базовые классы перечисляются через запятую. Каждый базовый класс может иметь свой спецификатор доступа: public, protected или private. Производный класс получает доступ ко всем открытым и защищённым членам своих базовых классов.

Синтаксис

class Derived : access Base1, access Base2, ... { // тело класса };

Пример

Давайте создадим два базовых класса Flyable и Swimmable, а затем производный класс Duck, который наследует от обоих:

#include <iostream> using namespace std; class Flyable { public: void fly() { cout << "Flying" << endl; } }; class Swimmable { public: void swim() { cout << "Swimming" << endl; } }; class Duck : public Flyable, public Swimmable { public: void quack() { cout << "Quack" << endl; } }; int main() { Duck d; d.fly(); d.swim(); d.quack(); return 0; }

Результат выполнения кода:

"Flying" "Swimming" "Quack"

Пример

Давайте рассмотрим проблему ромбовидного наследования. Классы A и B наследуют от Base, а класс C - от обоих. При обычном множественном наследовании возникает дублирование членов базового класса:

#include <iostream> using namespace std; class Base { public: int value = 10; }; class A : public Base {}; class B : public Base {}; class C : public A, public B {}; int main() { C obj; // cout << obj.value; // ошибка: неоднозначность cout << obj.A::value << endl; cout << obj.B::value << endl; return 0; }

Результат выполнения кода:

10 10

Пример

Чтобы устранить дублирование при ромбовидном наследовании, применяют виртуальное наследование с ключевым словом virtual. Тогда базовый класс Base будет представлен в классе C только один раз:

#include <iostream> using namespace std; class Base { public: int value = 10; }; class A : virtual public Base {}; class B : virtual public Base {}; class C : public A, public B {}; int main() { C obj; cout << obj.value << endl; return 0; }

Результат выполнения кода:

10

Смотрите также

  • ключевое слово наследование,
    которое описывает одиночное наследование классов
  • ключевое слово virtual,
    которое применяется для виртуального наследования
  • ключевое слово public,
    которое задаёт открытый доступ к членам класса
  • ключевое слово virtual,
    которое используется для виртуальных методов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить