logo

Спадкування в C++

Здатність a клас отримати властивості та характеристики з іншого класу називається Спадщина . Спадкування є однією з найважливіших особливостей об'єктно-орієнтованого програмування.

Успадкування — це функція або процес, у якому нові класи створюються з існуючих класів. Створений новий клас називається похідним класом або дочірнім класом, а існуючий клас відомий як базовий або батьківський клас. Тепер кажуть, що похідний клас успадковується від базового класу.



Коли ми говоримо, що похідний клас успадковує базовий клас, це означає, що похідний клас успадковує всі властивості базового класу, не змінюючи властивостей базового класу, і може додавати нові функції до своїх власних. Ці нові функції в похідному класі не впливатимуть на базовий клас. Похідний клас є спеціалізованим класом для базового класу.

  • Підклас: Клас, який успадковує властивості від іншого класу, називається підкласом або похідним класом.
  • Супер клас: Клас, властивості якого успадковуються підкласом, називається базовим класом або суперкласом.

Стаття поділена на такі підтеми:

  • Навіщо і коли використовувати успадкування?
  • Способи успадкування
  • Види спадкування

Навіщо і коли використовувати успадкування?

Розглянемо групу транспортних засобів. Вам потрібно створити класи для автобусів, автомобілів і вантажівок. Методи FuelAmount(), Capacity(), applyBrakes() будуть однаковими для всіх трьох класів. Якщо ми створюємо ці класи, уникаючи успадкування, тоді ми повинні записати всі ці функції в кожному з трьох класів, як показано на малюнку нижче:



успадкування в C++

char + int у java

Ви можете чітко бачити, що описаний вище процес призводить до дублювання того самого коду 3 рази. Це збільшує ймовірність помилок і надмірності даних. Щоб уникнути такого типу ситуації, використовується успадкування. Якщо ми створимо клас Vehicle і запишемо в нього ці три функції та успадкуємо решту класів від класу vehicle, тоді ми зможемо просто уникнути дублювання даних і підвищити можливість повторного використання. Подивіться на діаграму нижче, на якій три класи успадковані від класу транспортного засобу:

програма успадкування в C++



Використовуючи успадкування, ми повинні написати функції лише один раз замість трьох, оскільки ми успадкували решту трьох класів від базового класу (транспортного засобу).
Реалізація успадкування в C++ : Для створення підкласу, який успадковується від базового класу, ми повинні дотримуватися наведеного нижче синтаксису.

Похідні класи: Похідний клас визначається як клас, похідний від базового класу.
Синтаксис :

class :  {  //body }>

Де
class — ключове слово для створення нового класу
derived_class_name — назва нового класу, який успадкує базовий клас
специфікатор доступу — приватний, публічний або захищений. Якщо жоден не вказано, PRIVATE береться за замовчування
base-class-name — назва базового класу
Примітка : похідний клас не успадковує доступу членам особистих даних. Однак він успадковує повний батьківський об’єкт, який містить будь-які приватні члени, які оголошує цей клас.

приклад:
1. клас ABC : приватне XYZ //приватне похідне
{}
2. клас ABC : публічний XYZ //публічний вихід
{}
3. клас ABC: захищений XYZ //захищене похідне
{}
4. клас ABC: XYZ //приватне похідне за замовчуванням
{}

Примітка:

o Коли базовий клас приватно успадковується похідним класом, публічні члени базового класу стають приватними членами похідного класу, і, отже, доступ до публічних членів базового класу можна отримати лише за допомогою функцій-членів похідного класу. Вони недоступні для об'єктів похідного класу.
o З іншого боку, коли базовий клас публічно успадковується похідним класом, публічні члени базового класу також стають публічними членами похідного класу. Таким чином, публічні члени базового класу доступні об’єктам похідного класу, а також функціям-членам похідного класу.

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>> ім'я;  } void display_p() { cout<< endl <<'Id: '<< id << '
Name: ' << name <> курс;  cout<< 'Enter the Course Fee:';  cin>> плата;  } void display_s() { display_p();  cout<<'Course: '<< course << '
Fee: ' << fee << endl;  } }; int main() {  Student s;  s.set_s();  s.display_s();  return 0; }>

Вихід:

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>> ім'я; } void Person::display_p() { cout<>курс;  cout<<'Enter the Course Fee:';  cin>>плата; } void Student::display_s() { display_p();  cout<<'
Course: '<

Вихід:

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(це->ім'я,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; }>

Вихід
Child id is: 7 Parent id is: 91>

У наведеній вище програмі клас «Child» публічно успадковується від класу «Parent», тому загальнодоступні члени даних класу «Parent» також успадковуються класом «Child».
Способи успадкування: Існує 3 способи успадкування.

  1. Громадський режим : якщо ми отримуємо підклас із публічного базового класу. Тоді публічний член базового класу стане публічним у похідному класі, а захищені члени базового класу стануть захищеними в похідному класі.
  2. Захищений режим : якщо ми отримуємо підклас із захищеного базового класу. Тоді і публічні, і захищені члени базового класу стануть захищеними в похідному класі.
  3. Приватний режим : Якщо ми отримуємо підклас із базового класу Private. Тоді і публічні, і захищені члени базового класу стануть приватними в похідному класі.

Примітка: До приватних членів базового класу неможливо отримати прямий доступ у похідному класі, тоді як до захищених членів можна отримати прямий доступ. Наприклад, усі класи B, C і D містять змінні x, y і z у прикладі нижче. Це лише питання доступу.

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


У наведеній нижче таблиці підсумовуються три вищезазначені режими та показано специфікатор доступу для членів базового класу в підкласі, отриманих у публічному, захищеному та приватному режимах:

кортеж python відсортовано

Типи успадкування: -

  1. Єдине успадкування
  2. Багаторівневе успадкування
  3. Множинне успадкування
  4. Ієрархічна спадковість
  5. Гібридне успадкування

Типи успадкування в C++

1. Єдине успадкування : при одинарному успадкуванні класу дозволено успадковувати лише один клас. тобто один підклас успадковується лише одним базовим класом.

Єдине успадкування в C++

Синтаксис :

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

Вихід
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<Вихідні дані:- Введіть значення A= 3 3 Введіть значення B= 5 5 Добуток 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. Множинне успадкування: Множинне успадкування — це функція C++, де клас може успадковувати більше ніж один клас. тобто один підклас успадковується від кількох базовий клас .

Множинне успадкування в C++

Синтаксис :

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

Тут кількість базових класів буде відокремлено комою (‘, ‘), а для кожного базового класу має бути вказано режим доступу.

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

Вихід
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<Щоб дізнатися більше про це, зверніться до статті Множинне успадкування .


3. Багаторівневе успадкування : у цьому типі успадкування похідний клас створюється з іншого похідного класу.

Багаторівневе успадкування в C++

кіноактриса Каджал

Синтаксис: -

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

Вихід
This is a Vehicle Objects with 4 wheels are vehicles Car has 4 Wheels>

4. Ієрархічне успадкування : у цьому типі успадкування більше одного підкласу успадковується від одного базового класу. тобто більше ніж один похідний клас створюється з одного базового класу.

Ієрархічне успадкування в C++

Синтаксис: -

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

Вихід
This is a Vehicle This is a Vehicle>

5. Гібридне (віртуальне) успадкування : гібридне успадкування реалізується шляхом поєднання більш ніж одного типу успадкування. Наприклад: поєднання ієрархічного успадкування та множинного успадкування.
На зображенні нижче показано поєднання ієрархічного та множинного успадкування:

Гібридне успадкування в 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; }>

Вихід
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;   } };    class B : public A { protected: int b;   public: void get_b() { cout<< 'Enter the value of 'b' : ';  cin>>b;   } };  class C { protected: int c;   public: void get_c() { cout<< 'Enter the value of c is : ';   cin>>c;   } };    class D : public B, public C { protected: int d;   public: void mul() { get_a();   get_b();   get_c();   cout<< 'Multiplication of a,b,c is : ' < 

6. Окремий випадок гібридного успадкування: багатошляхове успадкування :
Похідний клас із двома базовими класами, причому ці два базові класи мають один спільний базовий клас, називається багатошляховим успадкуванням. У цьому типі успадкування може виникнути неоднозначність.
приклад:

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

Вихід
 a from ClassB : 10 a from ClassC : 100 b : 20 c : 30 d : 40>

У наведеному вище прикладі і ClassB, і ClassC успадковують ClassA, вони обидва мають одну копію ClassA. Однак Class-D успадковує як ClassB, так і ClassC, отже, Class-D має дві копії ClassA, одну від ClassB, а іншу від ClassC.
Якщо нам потрібно отримати доступ до члена даних ClassA через об’єкт Class-D, ми повинні вказати шлях, з якого здійснюватиметься доступ до a, будь то з ClassB чи ClassC, компілятор bcoz не може відрізнити дві копії ClassA в Клас-D.

відсортований список масивів у java

Є 2 способи уникнути цієї неоднозначності:

1) Уникнення неоднозначності за допомогою оператора дозволу області: Використовуючи оператор дозволу області видимості, ми можемо вручну вказати шлях, з якого буде здійснюватися доступ до елемента даних a, як показано в операторах 3 і 4 у наведеному вище прикладі.

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


Примітка: Тим не менш, є дві копії ClassA в Class-D.
2) Уникнення неоднозначності за допомогою віртуального базового класу:

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

Вихід:

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

Згідно з наведеним вище прикладом, Class-D має лише одну копію ClassA, отже, оператор 4 перезапише значення a, наведене в операторі 3.