Множественное наследование
Множественное наследование - это механизм в 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,
которое используется для виртуальных методов