C++ ООП. Спадкування


Спадкування

У C++ можна успадковувати атрибути і методи від одного класу до іншого. Поняття спадкування має дві категорії:

  • Похідний клас (дитина) - клас, який успадковує від іншого класу
  • Базовий клас (батько) - клас успадковується від

У наведеному нижче прикладі, Car клас (дитина) успадковує атрибути і методи з Vehicle класу (одного з батьків):

#include <iostream>
#include <string>
using namespace std;

class Vehicle {                    // Базовий клас (батько) 

  public: 
    string brand = "Ford";

    void honk() {
      cout << "Tuut, tuut! \n" ;
    }

};


class Car: public Vehicle {        // Отриманий клас (Спадкуванням)

  public: 
    string model = "Mustang";

};

int main() {

  Car myCar;
  myCar.honk();                                 // Tuut, tuut!
  cout << myCar.brand + " " + myCar.model;      // Ford Mustang 

  return 0;
}

// RESULT:
// Tuut, tuut!
// Ford Mustang 

Коли використовувати спадкування?

Це корисно для повторного використання коду: повторне використання атрибутів і методів існуючого класу при створенні нового класу.


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

Клас також може бути отриманий з одного класу, який вже отриманий з іншого класу.

У наступному прикладі, MyGrandChild є похідним від класу MyChild (який є похідним від MyClass ).

#include <iostream>
using namespace std;


class MyClass {                                  // Parent class

  public: 
    void myFunction() {
      cout << "Some content in parent class." ;
    }

};


class MyChild: public MyClass {                  // Child class
};

class MyGrandChild: public MyChild {            // Grandchild class 
};

int main() {

  MyGrandChild myObj;
  myObj.myFunction();          // Some content in parent class. 

  return 0;
}

// RESULT:
// Some content in parent class. 

множинне спадкування

Клас також може бути отриманий з більш ніж одного базового класу, використовуючи список розділений комою:

#include <iostream>
using namespace std;


class MyClass {                   // базовий клас

  public:
    void myFunction() {
      cout << "Some content in parent class.\n" ;
    }

};


class MyOtherClass {              // Інший базовий клас

  public:
    void myOtherFunction() {
      cout << "Some content in another class.\n" ;
    }

};


class MyChildClass: public MyClass, public MyOtherClass {   // Отриманий клас
};

int main() {

  MyChildClass myObj;
  myObj.myFunction();         // Some content in parent class.
  myObj.myOtherFunction();    // Some content in another class.

  return 0;
}

// RESULT:
// Some content in parent class.
// Some content in another class.

специфікатор доступу

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

#include <iostream>
using namespace std;

class Employee  {        // Базовий клас

  protected:             // Захищений специфікатор доступу protected
    int salary;

};

class Programmer: public Employee {   // Отриманий клас

  public:
    int bonus;

    void setSalary(int s) {
      salary = s;
    }

    int getSalary() {
      return salary;
    }

};

int main() {

  Programmer myObj;
  myObj.setSalary(50000);
  myObj.bonus = 15000;

  cout << "Salary: " << myObj.getSalary() << "\n";   // Salary: 50000
  cout << "Bonus: " << myObj.bonus << "\n";          // Bonus: 15000 

  return 0;
}

// RESULT:
// Salary: 50000
// Bonus: 15000 

Наш партнер:
beta test mp3 playlist downloader