logo

Arv i C++

Förmågan hos en klass att härleda egenskaper och egenskaper från en annan klass kallas Arv . Arv är en av de viktigaste funktionerna i objektorienterad programmering.

Arv är en funktion eller en process där nya klasser skapas från de befintliga klasserna. Den nya klassen som skapas kallas härledd klass eller barnklass och den befintliga klassen är känd som basklassen eller överordnad klass. Den härledda klassen sägs nu vara ärvd från basklassen.



När vi säger att den härledda klassen ärver basklassen betyder det att den härledda klassen ärver alla basklassens egenskaper utan att ändra basklassens egenskaper och kan lägga till nya funktioner till sin egen. Dessa nya funktioner i den härledda klassen kommer inte att påverka basklassen. Den härledda klassen är den specialiserade klassen för basklassen.

  • Underklass: Klassen som ärver egenskaper från en annan klass kallas Subclass eller Derived Class.
  • Superklass: Klassen vars egenskaper ärvs av en underklass kallas Base Class eller Superclass.

Artikeln är uppdelad i följande underämnen:

  • Varför och när ska man använda arv?
  • Arvssätt
  • Typer av arv

Varför och när ska man använda arv?

Tänk på en grupp av fordon. Du måste skapa klasser för buss, bil och lastbil. Metoderna fuelAmount(), capacity(), applyBrakes() kommer att vara desamma för alla tre klasserna. Om vi ​​skapar dessa klasser och undviker arv måste vi skriva alla dessa funktioner i var och en av de tre klasserna enligt bilden nedan:



arv i C++

järv vs grävling

Du kan tydligt se att ovanstående process resulterar i duplicering av samma kod 3 gånger. Detta ökar risken för fel och dataredundans. För att undvika den här typen av situationer används arv. Om vi ​​skapar en klass Fordon och skriver dessa tre funktioner i den och ärver resten av klasserna från fordonsklassen, så kan vi helt enkelt undvika dubbelarbete av data och öka återanvändbarheten. Titta på diagrammet nedan där de tre klasserna ärvs från fordonsklassen:

arvsansökan i C++



Med arv måste vi bara skriva funktionerna en gång istället för tre gånger eftersom vi har ärvt resten av de tre klasserna från basklassen (Fordon).
Implementering av arv i C++ : För att skapa en underklass som ärvs från basklassen måste vi följa syntaxen nedan.

Härledda klasser: En härledd klass definieras som den klass som härleds från basklassen.
Syntax :

class :  {  //body }>

Var
class — nyckelord för att skapa en ny klass
derived_class_name — namnet på den nya klassen, som kommer att ärva basklassen
åtkomstspecificerare — antingen privat, offentlig eller skyddad. Om ingetdera anges tas PRIVATE som standard
basklassnamn — namnet på basklassen
Notera : En härledd klass ärver inte tillgång till privata datamedlemmar. Det ärver dock ett fullständigt överordnat objekt, som innehåller alla privata medlemmar som den klassen deklarerar.

Exempel:
1. klass ABC : privat XYZ //privat härledning
{ }
2. klass ABC : offentlig XYZ //offentlig härledning
{ }
3. klass ABC : skyddad XYZ //skyddad härledning
{ }
4. klass ABC: XYZ //privat härledning som standard
{ }

Notera:

o När en basklass ärvs privat av den härledda klassen, blir offentliga medlemmar av basklassen de privata medlemmarna i den härledda klassen och därför kan de offentliga medlemmarna i basklassen endast nås av medlemsfunktionerna i den härledda klassen. De är otillgängliga för objekten i den härledda klassen.
o Å andra sidan, när basklassen ärvs offentligt av den härledda klassen, blir offentliga medlemmar av basklassen också offentliga medlemmar av den härledda klassen. Därför är de offentliga medlemmarna i basklassen tillgängliga för objekten i den härledda klassen såväl som av medlemsfunktionerna i den härledda klassen.

C++
// 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>> namn;  } void display_p() { cout<< endl <<'Id: '<< id << '
Name: ' << name <> kurs;  cout<< 'Enter the Course Fee:';  cin>> avgift;  } void display_s() { display_p();  cout<<'Course: '<< course << '
Fee: ' << fee << endl;  } }; int main() {  Student s;  s.set_s();  s.display_s();  return 0; }>

Produktion:

java substring exempel
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>>namn; } void Person::display_p() { cout<>kurs;  cout<<'Enter the Course Fee:';  cin>>avgift; } void Student::display_s() { display_p();  cout<<'
Course: '<

Produktion:

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(detta->namn,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; }>

Produktion
Child id is: 7 Parent id is: 91>

I programmet ovan ärvs klassen 'Barn' offentligt från klassen 'Förälder', så de offentliga datamedlemmarna i klassen 'Förälder' kommer också att ärvas av klassen 'Barn'.
Arvssätt: Det finns 3 arvssätt.

  1. Offentligt läge : Om vi ​​härleder en underklass från en offentlig basklass. Då kommer den offentliga medlemmen av basklassen att bli offentlig i den härledda klassen och skyddade medlemmar av basklassen kommer att bli skyddade i den härledda klassen.
  2. Skyddat läge : Om vi ​​härleder en underklass från en skyddad basklass. Då kommer både offentliga medlemmar och skyddade medlemmar av basklassen att bli skyddade i den härledda klassen.
  3. Privat läge : Om vi ​​härleder en underklass från en Privat basklass. Då kommer både offentliga medlemmar och skyddade medlemmar av basklassen att bli privata i den härledda klassen.

Notera: De privata medlemmarna i basklassen kan inte nås direkt i den härledda klassen, medan skyddade medlemmar kan nås direkt. Till exempel innehåller klasserna B, C och D alla variablerna x, y och z i exemplet nedan. Det är bara en fråga om tillgång.

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 };>


Tabellen nedan sammanfattar ovanstående tre lägen och visar åtkomstspecifikationen för medlemmarna i basklassen i underklassen när den härleds i offentliga, skyddade och privata lägen:

Typer av arv:-

  1. Enstaka arv
  2. Arv på flera nivåer
  3. Multipelt arv
  4. Hierarkiskt arv
  5. Hybrid arv

Typer av arv i C++

1. Enstaka arv : I enstaka arv tillåts en klass att ärva från endast en klass. dvs en underklass ärvs endast av en basklass.

Enkelarv i C++

Syntax :

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; }>

Produktion
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<Utdata:- Ange värdet på A= 3 3 Ange värdet på B= 5 5 Produkt av 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<Product of 4 * 5 = 20>

2. Multipelt arv: Multiple Inheritance är en funktion i C++ där en klass kan ärva från mer än en klass. dvs en underklass ärvs från mer än en basklass .

Multipelt arv i C++

Syntax :

class subclass_name : access_mode base_class1, access_mode base_class2, .... {  // body of subclass }; class B {  ... .. ...  }; class C { ... .. ... }; class A: public B, public C { ... ... ... };>

Här kommer antalet basklasser att separeras med ett kommatecken (', ') och åtkomstläget för varje basklass måste anges.

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; }>

Produktion
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<För att veta mer om det, se artikeln Flera arv .


3. Arv på flera nivåer : I den här typen av arv skapas en härledd klass från en annan härledd klass.

Multilevel Arv i C++

css fetstil

Syntax:-

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; }>

Produktion
This is a Vehicle Objects with 4 wheels are vehicles Car has 4 Wheels>

4. Hierarkiskt arv : I denna typ av arv ärvs mer än en underklass från en enda basklass. d.v.s. mer än en härledd klass skapas från en enda basklass.

Hierarkiskt arv i C++

Syntax:-

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; }>

Produktion
This is a Vehicle This is a Vehicle>

5. Hybrid (virtuell) arv : Hybrid arv implementeras genom att kombinera mer än en typ av arv. Till exempel: Kombinera hierarkiskt arv och multipelt arv.
Bilden nedan visar kombinationen av hierarkiska och multipla arv:

Hybrid arv i C++.

CPP
// 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; }>

Produktion
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;   } };    klass B : offentlig A { skyddad: int b;   public: void get_b() { cout<< 'Enter the value of 'b' : ';  cin>>b;   } };  klass C { skyddad: int c;   public: void get_c() { cout<< 'Enter the value of c is : ';   cin>>c;   } };    klass D: offentlig B, offentlig C { skyddad: int d;   public: void mul() { get_a();   get_b();   get_c();   cout<< 'Multiplication of a,b,c is : ' < 

6. Ett specialfall av hybridarv: Flervägsarv :
En härledd klass med två basklasser och dessa två basklasser har en gemensam basklass kallas flervägsarv. Otydlighet kan uppstå i denna typ av arv.
Exempel:

CPP
// 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 << '
'; }>

Produktion
 a from ClassB : 10 a from ClassC : 100 b : 20 c : 30 d : 40>

I exemplet ovan ärver både ClassB och ClassC ClassA, de har båda en enda kopia av ClassA. Men Klass-D ärver både KlassB och KlassC, därför har Klass-D två kopior av KlassA, en från KlassB och en annan från KlassC.
Om vi ​​behöver komma åt datamedlemmen i ClassA genom objektet i Class-D, måste vi specificera sökvägen från vilken a kommer att nås, oavsett om det är från ClassB eller ClassC, bcoz-kompilatorn kan inte skilja mellan två kopior av ClassA i Klass-D.

Det finns två sätt att undvika denna tvetydighet:

1) Undvik otydlighet med hjälp av scope resolution operator: Med hjälp av scope resolution-operatorn kan vi manuellt specificera sökvägen från vilken datamedlem a kommer att nås, som visas i satserna 3 och 4, i exemplet ovan.

CPP
obj.ClassB::a = 10; // Statement 3 obj.ClassC::a = 100; // Statement 4>


Notera: Ändå finns det två exemplar av klass A i klass-D.
2) Undvik otydlighet med den virtuella basklassen:

java tuplar
CPP
#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 << '
'; }>

Produktion:

a : 100 b : 20 c : 30 d : 40>

Enligt exemplet ovan har Klass-D bara en kopia av KlassA, därför kommer påstående 4 att skriva över värdet av a, som anges i påstående 3.