В этой статье вы узнаете о различных моделях наследования в программировании на 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 (…) класс первый_производный_класс: общедоступный базовый_класс (…) класс второй_производный_класс: общедоступный базовый_класс (…) класс третий_производный_класс: общедоступный базовый_класс (…)