types inheritance c
Истражите све типове наследства на језику Ц ++ са примерима.
У нашем претходном водичу сазнали смо о наслеђивању у Ц ++. У зависности од начина на који је класа изведена или колико основних класа класа наслеђује, имамо следеће типове наследства:
- Наслеђивање појединачно
- Вишеструко наслеђивање
- Наслеђивање на више нивоа
- Хијерархијско наслеђивање
- Хибридно наслеђивање
=> Погледајте овде како бисте истражили целу листу водича за Ц ++.
Шта ћете научити:
Врсте наслеђивања
Доље је дат сликовни приказ различитих врста наследства.
Видећемо сваку врсту наслеђа са примерима у следећим одељцима.
# 1) Једно наслеђивање
У појединачном наслеђивању, класа потиче само из једне основне класе. То значи да постоји само једна подкласа која је изведена из једне суперкласе.
Појединачно наследство се обично декларише на следећи начин:
class subclassname : accessspecifier superclassname { //class specific code; };
Дати у наставку је комплетан Пример појединачног наслеђивања.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< Излаз:
Пас има 4 ноге
Пас има 1 реп
Пас лаје !!!
Имамо класу Анимал као основну класу из које смо извели пса подкласе. Пас класе наслеђује све чланове класе Анимал и може се проширити тако да укључује своја својства, као што се види из резултата.
Наслеђивање појединачно је најједноставнији облик наследства.
# 2) Вишеструко наслеђивање
Вишеструко наслеђивање је сликовито представљено у наставку.

Вишеструко наслеђивање је врста наследства у којој класа потиче из више класа. Као што је приказано на горњем дијаграму, класа Ц је подкласа којој су класа А и класа Б као родитељ.
У стварном сценарију дете наслеђује од оца и мајке. Ово се може сматрати примером вишеструког наслеђивања.
Представљамо програм у наставку да бисмо демонстрирали вишеструко наслеђивање.
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
Излаз:
Унесите списак бројева: 25
Унесите две највише оцене: 40 50
Унесите ознаку за наставне активности: 30
Број ролне: 25
Укупан број оцена: 120
Просечне оцене: 40
У горњем примеру имамо три одељења, тј. Студентске ознаке, заједничке наставне ознаке и резултат. Ознака студент__разреда чита ознаку предмета за ученика. Разред цоцуррицулар_маркс чита оцене ученика у ваннаставним активностима.
Класа Резултат израчунава укупне_оцене за ученика заједно са просечним оценама.
У овом моделу, класа Резултат је изведена из ознака ученика и заједничких курикулума, док израчунавамо резултат из предмета као и оцене заједничких курикуларних активности.
Ово показује више наслеђа.
Дијамантски проблем
Дијамантски проблем је сликовито представљен у наставку:

како да отворим апк датотеке
Овде имамо разред детета који наслеђује два разреда оца и мајку. Ове две класе, заузврат, наслеђују класу Особа.
Као што је приказано на слици, разред Дете наслеђује особине разреда Особа два пута, тј. Једном од оца, а други пут од мајке. То доводи до двосмислености јер компајлер не успева да разуме којим путем да крене.
Будући да се овај сценарио јавља када имамо наслеђе у облику дијаманта, овај проблем се познато назива „ Дијамантски проблем ”.
Дијамантски проблем имплементиран у Ц ++ резултира двосмисленом грешком при компилацији. Овај проблем можемо решити тако што ћемо основну класу учинити виртуелном. Сазнаћемо више о „виртуелној“ кључној речи у нашем предстојећем водичу о полиморфизму.
# 3) Наслеђивање на више нивоа
Наслеђивање на више нивоа представљено је у наставку.

У наслеђивању на више нивоа, класа је изведена из друге изведене класе. Ово наследство може имати толико нивоа ако наша примена не иде унапред. У горњем дијаграму, класа Ц је изведена из класе Б. Класа Б је пак изведена из класе А.
Погледајмо пример вишеразинског наслеђа.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< Излаз:
Штене има 4 ноге
Штене има 1 реп
Пуппи Баркс !!! Штене плаче !!
Овде смо модификовали пример за наслеђивање Сингле тако да постоји нова класа Пуппи која наслеђује из класе Дог која заузврат наслеђује из класе Анимал. Видимо да класа Штене стиче и користи својства и методе обе класе изнад ње.
# 4) Хибридно наслеђивање
Хибридно наслеђе је приказано доле.

Хибридно наслеђивање је обично комбинација више врста наслеђа. У горњој представи имамо вишеструко наслеђивање (Б, Ц и Д) и вишеразинско наследство (А, Б и Д) да бисмо добили хибридно наследство.
Погледајмо пример хибридног наслеђивања.
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
Излаз:
Унесите ИД студента и име студента 25 Вед
Унесите 3 оцене предмета: 89 88 87
Унесите спортске оцене: 40
Укупне оцене = 264
Просечне оцене = 88
Просек + спортске оцене = 128
Овде имамо четири одељења, тј. Студент, Маркс, Спортс и Ресулт. Ознаке су изведене из студентског разреда. Резултат класе потиче из оцене и спорта јер рачунамо резултат из оцене предмета као и оцене спорта.
Излаз се генерише стварањем објекта класе Резултат који је стекао својства све три класе.
Имајте на уму да и у хибридном наслеђивању примена може резултирати „Дијамантским проблемом“ који се може решити помоћу кључне речи „виртуелна“ као што је претходно поменуто.
# 5) Хијерархијско наслеђивање

У хијерархијском наслеђивању, више од једне класе наслеђује из једне основне класе као што је приказано у горњој представи. То му даје структуру хијерархије.
Доље је дат пример који показује хијерархијско наслеђивање.
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< Излаз:
Унесите дужину и ширину правоугаоника: 10 5
Површина правоугаоника = 50
Унесите основу и висину троугла: 4 8
Површина троугла = 16
Унесите дужину једне странице квадрата: 5
Површина квадрата = 20
Горњи пример је класичан пример класе Облик. Имамо основну класу Схапе и из ње се изводе три класе, тј. Правоугаоник, троугао и квадрат.
Имамо метод за читање података у класи Схапе, док свака изведена класа има свој метод за израчунавање површине. У главној функцији читамо податке за сваки објекат, а затим израчунавамо површину.
Закључак
У поређењу са осталим програмским језицима, језик Ц ++ подржава све врсте наслеђивања. У ствари, можемо рећи да Ц ++ има веома добру подршку за наслеђивање. Помоћу Ц ++ можемо ефикасније моделирати проблеме у стварном времену.
У овом упутству видели смо све врсте наслеђивања подржане у Ц ++.
Такође прочитајте = >> Врсте наслеђивања у Јави
У нашем предстојећем упутству сазнаћемо више о карактеристикама полиморфизма ООП-а.
=> Овде погледајте комплетну Ц ++ БЕСПЛАТНУ серију обука.
Препоручено читање
- Наслеђивање у Ц ++
- Типови података Ц ++
- Врсте ризика у софтверским пројектима
- Питхон типови података
- Најбољи БЕСПЛАТНИ водичи за Ц #: Крајњи водич за Ц # за почетнике
- Типови петље Уник шкољке: Радите док се петља, за петљу, док се петља не заврши у Унику
- Различите врсте подударања које пружа Моцкито
- 7 врста софтверских грешака које би сваки тестер требао знати