Все, что вам нужно знать о наследовании в C ++



Эта статья предоставит вам подробные и всесторонние знания о наследовании в C ++, его различных типах и способах его реализации.

C ++ - объектно-ориентированный язык. Абстракция данных, полиморфизм, инкапсуляция и наследование являются краеугольными камнями ООП. В этом посте мы разберемся, что такое наследование? Типы наследования в C ++ и все необходимые понятия, связанные с ним с нуля. В конце концов, мы также рассмотрим недостаток этой мощной концепции и попытаемся его решить.

Что такое наследование в C ++

Наследование - одна из самых мощных и широко используемых концепций C ++ или любого другого объектно-ориентированного языка. Понимание этой концепции требует небольшого знания классов и объектов. Используя наследование, мы можем создать класс, состоящий из общих методов и атрибутов. Этот класс может быть унаследован другими классами, содержащими более конкретные методы.





Наследование в C ++

Благодаря этому нам не нужно снова и снова писать одни и те же функции, что экономит время и повышает читаемость кода.



Синтаксис:

class производный_class: access_type base_class {// тело класса}

Базовый класс: Класс, который состоит из всех общих методов и атрибутов, которые могут использоваться другими классами для повышения читабельности кода, называется базовым классом.

Производный класс: Класс, который состоит из более конкретных методов и наследует класс, называется производным классом. Производный класс также может быть базовым классом для другого производного класса.



алгоритмы и структуры данных в java

Если мы создадим класс XYZ, с некоторыми атрибутами и методами. Теперь у учащегося класса будут некоторые другие атрибуты, но он также будет включать элементы класса XYZ, и то же самое касается класса факультета. Давайте посмотрим на схему:

Таким образом, класс студента и преподавателя унаследуется от XYZ.

Спецификатор доступа Мы поняли, как один класс может наследовать другой класс. Но некоторые люди могут сказать, что это небезопасный метод, поскольку все атрибуты и методы базового класса или родительского класса используются совместно с дочерним или производным классом. Например, если класс «Банк» унаследован классами «клиенты» и «инвесторы». Атрибуты класса «Банк», такие как «пароль хранилища», другая информация о клиентах и ​​личные данные передаются классам «клиенты» и «инвесторы», что небезопасно.

Чтобы решить указанную выше проблему, C ++ использует спецификаторы доступа, чтобы ограничить доступ атрибутов базового класса к производному классу. Всего в C ++ существует 3 типа спецификаторов доступа.

  1. Общественные
  2. Частный
  3. Защищено

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

Спецификатор доступа Общедоступные данные Личные данные Защищенные данные
Частный Не унаследованоНе унаследованоНе унаследовано
Защищено Защищено Частный Защищено
Общественные Общественные Частный Защищено

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

Единичное наследование можно рассматривать как простую ванильную форму наследования. При одиночном наследовании отдельный класс наследуется от базового класса.

#include с использованием пространства имен std class Train {int Numberofwheels int Numberofcoaches public: void Traininfo (int n, int m) {Numberofwheels = n Numberofcoaches = m} void showinfo () {cout<Этот случай наследования называется многоуровневым наследованием. Класс между первым и последним классом также известен как промежуточный базовый класс.Как вы думаете, может ли последний класс унаследовать члены первого класса? Да, оно может

#include с использованием пространства имен std class First {protected: int a public: void getinfofirst (int x) {a = x} void showinfofirst () {std :: cout<< 'Value of a = ' < 

Вывод:

Значение a = 10

Значение b = 20

Значение c = 30

Значение d = 50

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

Некоторые проблемы невозможно решить с помощью одноуровневого или многоуровневого наследования. При иерархическом наследовании от одного базового класса наследуется более 1 класса.

#include с использованием пространства имен std class College {public: College () {cout<< 'We are in class College' << endl } } class Student: public College { } class Faculty: public College { } int main() { Student student Faculty faculty return 0 }

Вывод:

c против c ++ против java

Мы в классе колледжа

Мы в классе колледжа

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

Мы видели в иерархическом наследовании один базовый класс имел более одного производного класса. При множественном наследовании один производный класс имеет более одного базового класса.

#include с использованием пространства имен std class One {protected: int a public: void getinfoOne (int x) {a = x}} class Two {protected: int b public: void getinfoTwo (int y) {b = y}} class Main: public One, public Two {public: void Display () {std :: cout<< 'Value of a = ' < На данный момент у нас есть хорошее представление обо всех типах наследования, используемых в C ++. Но подождите, а что, если мы хотим использовать 2 разных типа наследования? Является ли это возможным? Да, это возможно с помощью гибридного наследования. В гибридном наследовании мы комбинируем 2 разных типа наследования. Например - многоуровневое и множественное наследование, иерархическое и множественное наследование и т. Д.

#include с использованием пространства имен std class World {protected: int a public: void getinfoWorld (int x) {a = x}} class Continent: public World {protected: int b public: void getinfoContinent (int y) {b = y}} class Country {protected: int d public: void getinfoCountry (int m) {d = m}} class Australia: public Continent, public Country {public: void Display () {std :: cout<< 'Value of a = ' < 

Давайте разберемся с диаграммой выше, которая поможет нам понять проблему с алмазом. класс B и класс C наследуются от класса A, поэтому и класс A, и класс B имеют атрибуты и методы класса A. если класс D наследуется от класса B, а также класса C., класс D будет иметь все атрибуты класса B и класса C. Он также имеет все атрибуты класса A, унаследованные от класса B, а также от класса C., поэтому, если мы создадим объект класса D и вызовем метод класса A., будет создана неоднозначная ситуация, и компилятор будет запутан, откуда он должен классифицировать метод A, из класса B или класса D.

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

класс A {} класс B: виртуальная общедоступная A {} класс C: виртуальная общедоступная A {} класс D: общедоступная C, общедоступная D {}

На этом мы подошли к концу этой статьи о наследовании в C ++. Если вы хотите узнать больше, ознакомьтесь с от Edureka, надежной компании онлайн-обучения. Курс обучения и сертификации по Java J2EE и SOA от Edureka разработан, чтобы научить вас базовым и продвинутым концепциям Java, а также различным средам Java, таким как Hibernate и Spring.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев этого блога, и мы свяжемся с вами как можно скорее.