Типы наследования в C++

Типы наследованияВ нашей предыдущей статье мы рассказали вам о наследовании в C++. В зависимости от способа создания класса или от того, сколько базовых классов наследует класс, существуют следующие типы наследования:

  • Одиночное наследование
  • Множественное наследование
  • Многоуровневое наследование
  • Иерархическое наследование
  • Гибридное наследование

Типы наследования

Ниже приводится графическое представление различных типов наследования:

Виды наследования

Мы рассмотрим каждый тип наследования с примерами ниже в данной статье:

1) Одиночное наследование

При одиночном наследовании класс происходит только от одного базового класса. Это означает, что существует только один подкласс, производный от одного суперкласса.

Одиночное наследование обычно объявляется следующим образом:

class subclassname : accessspecifier superclassname {
//class specific code;
};

Одиночное наследование

Ниже приведен полный пример работы одиночного наследования:

Вывод данных:

Dog has 4 legs
Dog has 1 tail
Dog Barks!!!

В программе есть класс Animal в качестве базового класса, из которого мы создали подкласс dog. Класс dog наследует все члены класса Animal и может быть расширен для включения собственных свойств, как видно из выходных данных.

Одиночное наследование является простейшей формой наследования.

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

Графически, множественное наследование можно представить так:

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

Множественное наследование — это тип наследования, при котором класс является производным от более чем одного класса. Как показано на приведенной выше диаграмме, класс C является подклассом, у которого есть класс A и класс B в качестве его родителя.

В реальной жизни ребенок получает наследование от отца и матери. Это можно рассматривать как пример множественного наследования.

Приведенная ниже программа отлично демонстрирует работу множественного наследования:

Читать также:  Реляционные операторы в языке программирования Паскаль

Вывод данных:

Enter the Roll No.: 25
Enter the two highest marks: 40 50
Enter the mark for CoCurricular Activities: 30Roll No: 25
Total marks: 120
Average marks: 40

В приведенном выше примере есть три класса, т.е. student_marks, cocurricular_marks и Result. Класс student_marks считывает предметную оценку учащегося. Класс cocurricular_marks считывает оценки учащегося за внеклассные занятия.

Класс Result вычисляет total_marks для учащегося вместе со средними оценками.

В этой модели класс Result является производным от student_marks и cocurricular_marks, поскольку мы вычисляем Result по предмету, а также по оценкам внеклассной деятельности.

Ниже, графически, представлена «Проблема ромба»:

Проблема ромба

На схеме указан дочерний класс, наследующий два класса: Father (отец) и Mother (мать). Эти два класса, в свою очередь, наследуют класс Person (человек).

Как показано на рисунке, класс Child (ребенок) дважды наследует признаки класса Person, т.е. один раз от отца и второй раз от матери. Это порождает двусмысленность, поскольку компилятор не понимает, что ему делать.

Поскольку этот сценарий возникает только тогда, когда получается ромбовидное наследование, эта проблема получила название «Проблема ромба».

Проблема ромба, реализованная в C++, приводит к ошибке неоднозначности при компиляции. Мы можем решить эту проблему, сделав корневой базовый класс виртуальным. Вы сможете прочитать об этом в нашей следующей статье «Полиморфизм в С++«.

3) Многоуровневое наследование

Схема многоуровневого наследования представлена ниже:

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

При многоуровневом наследовании класс является производным от другого производного класса. У этого наследования может быть сколько угодно уровней, если только наша реализация не запутается. На приведенной выше диаграмме класс C является производным от класса B. Класс B, в свою очередь, является производным от класса A.

Читать также:  Обработка переменных в языке программирования Паскаль

Давайте посмотрим на пример многоуровневого наследования:

Вывод данных:

Puppy has 4 legs
Puppy has 1 tail
Puppy Barks!!! Puppy Weeps!!!

В данном программе мы изменили пример одиночного наследования таким образом, что появился новый класс Puppy, который наследуется от класса Dog, который, в свою очередь, наследуется от класса Animal. Отсюда мы можем видеть, что класс Puppy получает и использует свойства и методы обоих вышестоящих классов.

4) Гибридное наследование

Схема гибридного наследования изображена ниже:

Гибридное наследование

Гибридное наследование обычно представляет собой комбинацию более чем одного типа наследования. В приведенном выше представлении есть множественное наследование (B, C и D) и многоуровневое наследование (A, B и D), что и дает нам получение гибридного наследования.

Давайте рассмотрим пример гибридного наследования:

Вывод данных:

Enter student Id and student name 25 Ved
Enter 3 subject marks:89 88 87
Enter sports marks:40
Total marks =264
Average marks =88
Average + Sports marks =128

В программе есть четыре класса, т.е. «Student» (ученик), «Marks» (оценки), «Sports» (спорт) и «Result» (результат). Оценки выставляются классом ученика. Класс Result является производным от оценок и видов спорта, поскольку мы рассчитываем результат по предметным оценкам, а также по спортивным оценкам.

Выходные данные формируются путем создания объекта класса Result, который приобрел свойства всех трех классов.

Обратите внимание, что и при гибридном наследовании реализация может привести к «проблеме ромба», которую можно решить с помощью ключевого слова «virtual», но об этом в следующей статье.

Читать также:  Цикл Repeat-Until в языке программирования Паскаль

5) Иерархическое наследование

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

При иерархическом наследовании от одного базового класса наследуется более одного класса, как показано в приведенной выше схеме. Это и делает данную структуру иерархической.

Ниже приведен пример, демонстрирующий иерархическое наследование:

Вывод данных:

Enter the length and breadth of a rectangle: 10 5
Area of the rectangle = 50
Enter the base and height of the triangle: 4 8
Area of the triangle = 16
Enter the length of one side of the square: 5
Area of the square = 20

Приведенный выше пример является классическим примером класса Shape. В программе есть базовый класс Shape и три класса, то есть прямоугольник, треугольник и квадрат, производные от него.

У нас есть метод для чтения данных в классе Shape, в то время как каждый производный класс имеет свой собственный метод для вычисления площади. В основной функции мы считываем данные для каждого объекта, а затем вычисляем площадь.

Итог

По сравнению с другими языками программирования язык C++ поддерживает все типы наследования. На самом деле, можно сказать, что C++ имеет очень хорошую поддержку наследования. Благодаря этому, мы можем более эффективно моделировать проблемы в реальном времени.

В этой статье мы рассмотрели все типы наследования, поддерживаемые C++.

В нашей следующей статье мы поговорим о роли полиморфизма в C++, и приведем соответствующие примеры.

С Уважением, МониторБанк

Добавить комментарий