Sposobnost a razred za izpeljavo lastnosti in karakteristik iz drugega razreda Dedovanje . Dedovanje je ena najpomembnejših lastnosti objektno orientiranega programiranja.
Dedovanje je funkcija ali proces, v katerem se iz obstoječih razredov ustvarijo novi razredi. Nov ustvarjeni razred se imenuje izpeljani razred ali podrejeni razred, obstoječi razred pa je znan kot osnovni razred ali nadrejeni razred. Izpeljani razred naj bi bil zdaj podedovan od osnovnega razreda.
Ko rečemo, da izpeljani razred podeduje osnovni razred, to pomeni, da izpeljani razred podeduje vse lastnosti osnovnega razreda, ne da bi spremenil lastnosti osnovnega razreda in lahko svojim lastnim doda nove funkcije. Te nove funkcije v izpeljanem razredu ne bodo vplivale na osnovni razred. Izpeljani razred je specializiran razred za osnovni razred.
- Podrazred: Razred, ki podeduje lastnosti drugega razreda, se imenuje podrazred ali izpeljani razred.
- Super razred: Razred, katerega lastnosti podeduje podrazred, se imenuje osnovni razred ali nadrazred.
Članek je razdeljen na naslednje podteme:
- Zakaj in kdaj uporabiti dedovanje?
- Načini dedovanja
- Vrste dedovanja
Zakaj in kdaj uporabiti dedovanje?
Razmislite o skupini vozil. Ustvariti morate razrede za avtobus, avto in tovornjak. Metode fuelAmount(), capacity(), applyBrakes() bodo enake za vse tri razrede. Če ustvarimo te razrede tako, da se izognemo dedovanju, potem moramo vse te funkcije zapisati v vsakega od treh razredov, kot je prikazano na spodnji sliki:

režiser Karan Johar
Jasno lahko vidite, da zgornji postopek povzroči trikratno podvajanje iste kode. To poveča možnosti napak in odvečnosti podatkov. Da bi se izognili tej vrsti situacije, se uporablja dedovanje. Če ustvarimo razred Vozilo in vanj zapišemo te tri funkcije ter podedujemo preostale razrede iz razreda vozila, potem se lahko enostavno izognemo podvajanju podatkov in povečamo ponovno uporabnost. Poglejte spodnji diagram, v katerem so trije razredi podedovani iz razreda vozila:

Z uporabo dedovanja moramo funkcije zapisati le enkrat namesto trikrat, saj smo ostale tri razrede podedovali iz osnovnega razreda (Vozilo).
Implementacija dedovanja v C++ : Za ustvarjanje podrazreda, ki je podedovan iz osnovnega razreda, moramo upoštevati spodnjo sintakso.
Izpeljani razredi: Izpeljani razred je definiran kot razred, izpeljan iz osnovnega razreda.
Sintaksa :
class : { //body }>Kje
razred — ključna beseda za ustvarjanje novega razreda
derived_class_name — ime novega razreda, ki bo podedoval osnovni razred
specifikator dostopa — zasebno, javno ali zaščiteno. Če nobeno ni navedeno, je PRIVATE vzeto kot privzeto
ime osnovnega razreda — ime osnovnega razreda
Opomba : Izpeljani razred ne deduje dostop članom zasebnih podatkov. Vendar pa podeduje polni nadrejeni objekt, ki vsebuje vse zasebne člane, ki jih ta razred deklarira.
primer:
1. razred ABC : zasebno XYZ //zasebna izpeljava
{}
2. razred ABC : javni XYZ //javna izpeljava
{}
3. razred ABC : zaščiten XYZ // zaščitena izpeljava
{}
4. razred ABC: XYZ //privzeto zasebna izpeljava
{}
Opomba:
o Ko osnovni razred zasebno podeduje izpeljani razred, javni člani osnovnega razreda postanejo zasebni člani izpeljanega razreda, zato je do javnih članov osnovnega razreda mogoče dostopati le s funkcijami članov izpeljanega razreda. Objektom izpeljanega razreda niso dostopni.
o Po drugi strani pa, ko osnovni razred javno podeduje izpeljani razred, javni člani osnovnega razreda postanejo tudi javni člani izpeljanega razreda. Zato so javni člani osnovnega razreda dostopni tako s predmeti izpeljanega razreda kot tudi s funkcijami članov izpeljanega razreda.
// Example: define member function without argument within // the class #include using namespace std; class Person { int id; char name[100]; public: void set_p() { cout << 'Enter the Id:'; cin>> id; cout<< 'Enter the Name:'; cin>> ime; } void display_p() { cout<< endl <<'Id: '<< id << '
Name: ' << name <> tečaj; cout<< 'Enter the Course Fee:'; cin>> pristojbina; } void display_s() { display_p(); cout<<'Course: '<< course << '
Fee: ' << fee << endl; } }; int main() { Student s; s.set_s(); s.display_s(); return 0; }> Izhod:
matrični niz v c
Enter the Id: 101 Enter the Name: Dev Enter the Course Name: GCS Enter the Course Fee:70000 Id: 101 Name: Dev Course: GCS Fee: 70000>C++
// Example: define member function without argument outside the class #include using namespace std; class Person { int id; char name[100]; public: void set_p(); void display_p(); }; void Person::set_p() { cout<<'Enter the Id:'; cin>>id; cout<<'Enter the Name:'; cin>> ime; } void Person::display_p() { cout<>tečaj; cout<<'Enter the Course Fee:'; cin>>prispevek; } void Student::display_s() { display_p(); cout<<'
Course: '< Izhod:
Enter the Id: 101 Enter the Name: Dev Enter the Course Name: GCS Enter the Course Fee: 70000 Id: 101 Name: Dev Course: GCS Fee: 70000>C++
// Example: define member function with argument outside the class #include #include using namespace std; class Person { int id; char name[100]; public: void set_p(int,char[]); void display_p(); }; void Person::set_p(int id,char n[]) { this->id=id; strcpy(to->ime,n); } void Person::display_p() { cout< CPP
// C++ program to demonstrate implementation // of Inheritance #include using namespace std; // Base class class Parent { public: int id_p; }; // Sub class inheriting from Base Class(Parent) class Child : public Parent { public: int id_c; }; // main function int main() { Child obj1; // An object of class child has all data members // and member functions of class parent obj1.id_c = 7; obj1.id_p = 91; cout << 'Child id is: ' << obj1.id_c << '
'; cout << 'Parent id is: ' << obj1.id_p << '
'; return 0; }> Izhod
Child id is: 7 Parent id is: 91>
V zgornjem programu je razred »Child« javno podedovan od razreda »Parent«, tako da bo javne podatke, člane razreda »Parent«, podedoval tudi razred »Child«.
Načini dedovanja: Obstajajo 3 načini dedovanja.
- Javni način : Če izpeljemo podrazred iz javnega osnovnega razreda. Nato bo javni član osnovnega razreda postal javen v izpeljanem razredu in zaščiteni člani osnovnega razreda bodo postali zaščiteni v izpeljanem razredu.
- Zaščiten način : Če izpeljemo podrazred iz zaščitenega osnovnega razreda. Nato bodo tako javni člani kot zaščiteni člani osnovnega razreda postali zaščiteni v izpeljanem razredu.
- Zasebni način : Če izpeljemo podrazred iz zasebnega osnovnega razreda. Nato bodo javni in zaščiteni člani osnovnega razreda postali zasebni v izpeljanem razredu.
Opomba: Do zasebnih članov v osnovnem razredu ni mogoče neposredno dostopati v izpeljanem razredu, medtem ko je do zaščitenih članov mogoče neposredno dostopati. Na primer, vsi razredi B, C in D vsebujejo spremenljivke x, y in z v spodnjem primeru. Gre le za vprašanje dostopa.
CPP // C++ Implementation to show that a derived class // doesn’t inherit access to private data members. // However, it does inherit a full parent object. class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is public // y is protected // z is not accessible from B }; class C : protected A { // x is protected // y is protected // z is not accessible from C }; class D : private A // 'private' is default for classes { // x is private // y is private // z is not accessible from D };>
Spodnja tabela povzema zgornje tri načine in prikazuje specifikator dostopa članov osnovnega razreda v podrazredu, ko je izpeljan v javnem, zaščitenem in zasebnem načinu:

Vrste dedovanja: -
- Enkratno dedovanje
- Večnivojsko dedovanje
- Večkratno dedovanje
- Hierarhično dedovanje
- Hibridno dedovanje
Vrste dedovanja v C++
1. Enojno dedovanje : Pri enojnem dedovanju lahko razred deduje samo iz enega razreda. en podrazred podeduje samo en osnovni razred.

Sintaksa :
class subclass_name : access_mode base_class { // body of subclass }; OR class A { ... .. ... }; class B: public A { ... .. ... };>CPP // C++ program to explain // Single inheritance #include using namespace std; // base class class Vehicle { public: Vehicle() { cout << 'This is a Vehicle
'; } }; // sub class derived from a single base classes class Car : public Vehicle { }; // main function int main() { // Creating object of sub class will // invoke the constructor of base classes Car obj; return 0; }> Izhod
This is a Vehicle>
C++
// Example: #include using namespace std; class A { protected: int a; public: void set_A() { cout<<'Enter the Value of A='; cin>>a; } void disp_A() { cout< Izhod:- Vnesite vrednost A= 3 3 Vnesite vrednost B= 5 5 Zmnožek 3 * 5 = 15
C++
// Example: #include using namespace std; class A { protected: int a; public: void set_A(int x) { a=x; } void disp_A() { cout< Izhod
Product of 4 * 5 = 20>
2. Večkratno dedovanje: Večkratno dedovanje je značilnost C++, kjer lahko razred deduje iz več kot enega razreda. tj enega podrazred je podedovan od več kot enega osnovni razred .

Sintaksa :
class subclass_name : access_mode base_class1, access_mode base_class2, .... { // body of subclass }; class B { ... .. ... }; class C { ... .. ... }; class A: public B, public C { ... ... ... };>Tukaj bo število osnovnih razredov ločeno z vejico (', '), za vsak osnovni razred pa je treba določiti način dostopa.
CPP // C++ program to explain // multiple inheritance #include using namespace std; // first base class class Vehicle { public: Vehicle() { cout << 'This is a Vehicle
'; } }; // second base class class FourWheeler { public: FourWheeler() { cout << 'This is a 4 wheeler Vehicle
'; } }; // sub class derived from two base classes class Car : public Vehicle, public FourWheeler { }; // main function int main() { // Creating object of sub class will // invoke the constructor of base classes. Car obj; return 0; }> Izhod
This is a Vehicle This is a 4 wheeler Vehicle>
C++
// Example: #include using namespace std; class A { protected: int a; public: void set_A() { cout<<'Enter the Value of A='; cin>>a; } void disp_A() { cout<
Če želite izvedeti več o tem, si oglejte članek Večkratno dedovanje .
3. Večnivojsko dedovanje : Pri tej vrsti dedovanja je izpeljan razred ustvarjen iz drugega izpeljanega razreda.

koliko nič za en milijon
Sintaksa: -
class C { ... .. ... }; class B:public C { ... .. ... }; class A: public B { ... ... ... };>CPP // C++ program to implement // Multilevel Inheritance #include using namespace std; // base class class Vehicle { public: Vehicle() { cout << 'This is a Vehicle
'; } }; // first sub_class derived from class vehicle class fourWheeler : public Vehicle { public: fourWheeler() { cout << 'Objects with 4 wheels are vehicles
'; } }; // sub class derived from the derived base class fourWheeler class Car : public fourWheeler { public: Car() { cout << 'Car has 4 Wheels
'; } }; // main function int main() { // Creating object of sub class will // invoke the constructor of base classes. Car obj; return 0; }> Izhod
This is a Vehicle Objects with 4 wheels are vehicles Car has 4 Wheels>
4. Hierarhično dedovanje : Pri tej vrsti dedovanja je več kot en podrazred podedovan iz enega osnovnega razreda. tj. več kot en izpeljani razred je ustvarjen iz enega osnovnega razreda.

pretvori niz v int java
Sintaksa: -
class A { // body of the class A. } class B : public A { // body of class B. } class C : public A { // body of class C. } class D : public A { // body of class D. }>CPP // C++ program to implement // Hierarchical Inheritance #include using namespace std; // base class class Vehicle { public: Vehicle() { cout << 'This is a Vehicle
'; } }; // first sub class class Car : public Vehicle { }; // second sub class class Bus : public Vehicle { }; // main function int main() { // Creating object of sub class will // invoke the constructor of base class. Car obj1; Bus obj2; return 0; }> Izhod
This is a Vehicle This is a Vehicle>
5. Hibridno (navidezno) dedovanje : Hibridno dedovanje se izvaja s kombinacijo več kot ene vrste dedovanja. Na primer: Kombinacija hierarhičnega dedovanja in večkratnega dedovanja.
Spodnja slika prikazuje kombinacijo hierarhičnega in večkratnega dedovanja:

// C++ program for Hybrid Inheritance #include using namespace std; // base class class Vehicle { public: Vehicle() { cout << 'This is a Vehicle
'; } }; // base class class Fare { public: Fare() { cout << 'Fare of Vehicle
'; } }; // first sub class class Car : public Vehicle { }; // second sub class class Bus : public Vehicle, public Fare { }; // main function int main() { // Creating object of sub class will // invoke the constructor of base class. Bus obj2; return 0; }> Izhod
This is a Vehicle Fare of Vehicle>C++
// Example: #include using namespace std; class A { protected: int a; public: void get_a() { cout << 'Enter the value of 'a' : '; cin>>a; } }; razred B : javni A { zaščiten: int b; javno: void get_b() { cout<< 'Enter the value of 'b' : '; cin>>b; } }; razred C { zaščiten: int c; javno: void get_c() { cout<< 'Enter the value of c is : '; cin>>c; } }; razred D: javno B, javno C { zaščiteno: int d; javno: void mul() { get_a(); get_b(); get_c(); cout<< 'Multiplication of a,b,c is : ' <
6. Poseben primer hibridnega dedovanja: Multipath dedovanje :
Izvedeni razred z dvema osnovnima razredoma in ta dva osnovna razreda imata en skupni osnovni razred, se imenuje večpotno dedovanje. Pri tej vrsti dedovanja lahko pride do dvoumnosti.
primer:
// C++ program demonstrating ambiguity in Multipath // Inheritance #include using namespace std; class ClassA { public: int a; }; class ClassB : public ClassA { public: int b; }; class ClassC : public ClassA { public: int c; }; class ClassD : public ClassB, public ClassC { public: int d; }; int main() { ClassD obj; // obj.a = 10; // Statement 1, Error // obj.a = 100; // Statement 2, Error obj.ClassB::a = 10; // Statement 3 obj.ClassC::a = 100; // Statement 4 obj.b = 20; obj.c = 30; obj.d = 40; cout << ' a from ClassB : ' << obj.ClassB::a; cout << '
a from ClassC : ' << obj.ClassC::a; cout << '
b : ' << obj.b; cout << '
c : ' << obj.c; cout << '
d : ' << obj.d << '
'; }> Izhod
a from ClassB : 10 a from ClassC : 100 b : 20 c : 30 d : 40>
V zgornjem primeru tako ClassB kot ClassC podedujeta ClassA, oba imata eno kopijo ClassA. Vendar pa razred D podeduje tako razred B kot razred C, zato ima razred D dve kopiji razreda A, eno od razreda B in drugo od razreda C.
Če moramo dostopati do podatkovnega člana ClassA prek objekta Class-D, moramo podati pot, s katere bo dostopan, ne glede na to, ali je iz ClassB ali ClassC, prevajalnik bcoz ne more razlikovati med dvema kopijama ClassA v Razred-D.
Tej dvoumnosti se lahko izognete na dva načina:
1) Izogibanje dvoumnosti z uporabo operatorja ločljivosti obsega: Z uporabo operatorja ločljivosti obsega lahko ročno določimo pot, s katere bo dostopen podatkovni član a, kot je prikazano v izjavah 3 in 4 v zgornjem primeru.
CPP obj.ClassB::a = 10; // Statement 3 obj.ClassC::a = 100; // Statement 4>
Opomba: Kljub temu obstajata dve kopiji razreda A v razredu D.
2) Izogibanje dvoumnosti z uporabo virtualnega osnovnega razreda:
#include class ClassA { public: int a; }; class ClassB : virtual public ClassA { public: int b; }; class ClassC : virtual public ClassA { public: int c; }; class ClassD : public ClassB, public ClassC { public: int d; }; int main() { ClassD obj; obj.a = 10; // Statement 3 obj.a = 100; // Statement 4 obj.b = 20; obj.c = 30; obj.d = 40; cout << '
a : ' << obj.a; cout << '
b : ' << obj.b; cout << '
c : ' << obj.c; cout << '
d : ' << obj.d << '
'; }> Izhod:
a : 100 b : 20 c : 30 d : 40>
Glede na zgornji primer ima Class-D samo eno kopijo ClassA, zato bo izjava 4 prepisala vrednost a, podano v izjavi 3.