Множественное, многоуровневое и иерархическое наследование C ++

В этой статье вы узнаете о различных моделях наследования в программировании на C ++: множественном, многоуровневом и иерархическом наследовании с примерами.

Наследование - одна из основных функций объектно-ориентированного языка программирования. Это позволяет разработчикам программного обеспечения выводить новый класс из существующего. Производный класс наследует функции базового класса (существующего класса).

В программировании на C ++ существуют различные модели наследования.

Многоуровневое наследование C ++

В программировании на C ++ вы можете не только наследовать класс от базового класса, но также можете наследовать класс от производного класса. Эта форма наследования известна как многоуровневое наследование.

класс А (…); класс B: общественный A (…); класс C: общественный B (………);

Здесь класс B является производным от базового класса A, а класс C является производным от производного класса B.

Пример 1: Многоуровневое наследование C ++

 #include using namespace std; class A ( public: void display() ( cout<<"Base class content."; ) ); class B : public A ( ); class C : public B ( ); int main() ( C obj; obj.display(); return 0; )

Вывод

 Содержание базового класса.

В этой программе класс C является производным от класса B (который является производным от базового класса A).

Объект obj класса C определен в main()функции.

Когда display()функция вызывается, display()в классе A выполняется. Это потому, что display()в классе C и классе B нет функции.

Компилятор сначала ищет display()функцию в классе C. Поскольку функции там нет, он ищет функцию в классе B (поскольку C является производным от B).

Функция также не существует в классе B, поэтому компилятор ищет ее в классе A (поскольку B является производным от A).

Если display()функция существует в C, компилятор переопределяет display()класс A (из-за переопределения функции-члена).

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

В программировании на C ++ класс может быть производным от нескольких родителей. Например: класс Bat является производным от базовых классов Mammal и WingedAnimal. Это имеет смысл, потому что летучая мышь - это не только крылатое животное, но и млекопитающее.

Пример 2: Множественное наследование в программировании на C ++

 #include using namespace std; class Mammal ( public: Mammal() ( cout << "Mammals can give direct birth." << endl; ) ); class WingedAnimal ( public: WingedAnimal() ( cout << "Winged animal can flap." << endl; ) ); class Bat: public Mammal, public WingedAnimal ( ); int main() ( Bat b1; return 0; ) 

Вывод

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

Неоднозначность при множественном наследовании

Наиболее очевидная проблема множественного наследования возникает во время переопределения функции.

Предположим, два базовых класса имеют одну и ту же функцию, которая не переопределяется в производном классе.

Если вы попытаетесь вызвать функцию, используя объект производного класса, компилятор покажет ошибку. Это потому, что компилятор не знает, какую функцию вызывать. Например,

 class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )  

Эта проблема может быть решена с помощью функции разрешения области видимости, чтобы указать, какую функцию классифицировать как base1 или base2.

 int main () (obj.base1 :: someFunction (); // Вызывается функция класса base1 obj.base2 :: someFunction (); // Вызывается функция класса base2.)

Иерархическое наследование C ++

Если от базового класса унаследовано более одного класса, это называется иерархическим наследованием. При иерархическом наследовании все функции, общие для дочерних классов, включаются в базовый класс.

Например: физика, химия, биология являются производными от класса естественных наук.

Синтаксис иерархического наследования

 класс base_class (…) класс первый_производный_класс: общедоступный базовый_класс (…) класс второй_производный_класс: общедоступный базовый_класс (…) класс третий_производный_класс: общедоступный базовый_класс (…)

Интересные статьи...