Всичко, което трябва да знаете за наследяването в C ++



Тази статия ще ви предостави подробни и изчерпателни знания за наследяването в C ++, неговите различни видове и как да го приложите.

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

Какво е наследяване в C ++

Наследяването е една от най-мощните и широко използвани концепции в C ++ или всеки друг обектно-ориентиран език. Разбирането на тази концепция изисква малко познания за класове и обекти. Използвайки наследяване, можем да създадем клас, който се състои от общи методи и атрибути. Този клас може да бъде наследен от други класове, съдържащи по-специфични методи.





Наследяване в C ++

Правейки това, не е нужно да пишем едни и същи функционалности отново и отново, което спестява време и увеличава четливостта на кода.



Синтаксис:

клас производен_клас: достъп_тип 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 клас Първо {защитено: int a public: void getinfofirst (int x) {a = x} void showinfofirst () {std :: cout<< 'Value of a = ' < 

Изход:

Стойност на a = 10

Стойност на b = 20

Стойност на c = 30

pl / sql обработка на изключения

Стойност на 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 ++

Видяхме в йерархично наследяване един основен клас имаше повече от един производен клас. При множество наследяване един производен клас има повече от един основен клас.

#include използвайки пространство на имена std клас 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: 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 Държава {защитена: 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.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на този блог и ние ще се свържем с вас възможно най-скоро.