Спадщина С ++

У цьому підручнику ми дізнаємося про успадкування в C ++ за допомогою прикладів.

Спадкування є однією з ключових особливостей об’єктно-орієнтованого програмування на C ++. Це дозволяє нам створити новий клас (похідний клас) з існуючого класу (базовий клас).

Похідний клас успадковує ознаки базового класу і може мати власні додаткові функції. Наприклад,

 class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );

Тут Dogклас походить від Animalкласу. Оскільки Dogпоходить від Animal, члени AnimalДоступні для Dog.

Спадщина в C ++

Зверніть увагу на використання ключового слова publicпід час успадкування собаки від тварини.

 class Dog : public Animal (… );

Ми також можемо використовувати ключові слова privateта protectedзамість public. Ми дізнаємося про відмінності між використанням private, publicа protectedпізніше в цьому керівництві.

є-відносини

Спадщина - це відносини . Ми використовуємо успадкування лише в тому випадку, якщо між цими двома класами існує зв'язок is -a .

Ось кілька прикладів:

  • Автомобіль - це транспортний засіб.
  • Апельсин - це фрукт.
  • Хірург - це лікар.
  • Собака - це тварина.

Приклад 1: Простий приклад успадкування C ++

 // C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )

Вихідні дані

Я можу їсти! Я можу спати! Я можу гавкати! Woof woof !!

Тут dog1 (об'єкт похідного класу Dog) може отримати доступ до членів базового класу Animal. Це тому Dog, що передається у спадок від Animal.

 // Calling members of the Animal class dog1.eat(); dog1.sleep();

Захищені члени C ++

Модифікатор доступу protectedособливо актуальний, коли мова йде про успадкування С ++.

Як і privateчлени, protectedучасники недоступні поза класом. Однак до них можуть отримати доступ похідні класи та класи / функції друзів .

Нам потрібні protectedчлени, якщо ми хочемо приховати дані класу, але все ж хочемо, щоб ці дані успадковувались похідними класами.

Щоб дізнатись більше про захищений, зверніться до нашого підручника з модифікаторів доступу C ++.

Приклад 2: Захищені члени C ++

 // C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )

Вихідні дані

Я можу їсти! Я можу спати! Я можу гавкати! Woof woof !! Я ссавець Мій колір чорний

Тут тип змінної є protectedі таким чином доступний з похідного класу Dog. Ми можемо побачити це, оскільки ми ініціалізували typeв Dogкласі за допомогою функції setType().

З іншого боку, privateзмінний колір не можна ініціалізувати в Dog.

 class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );

Крім того, оскільки protectedключове слово приховує дані, ми не можемо отримати доступ до типу безпосередньо з об’єкта Dogабо Animalкласу.

 // Error: member "Animal::type" is inaccessible dog1.type = "mammal";

Режими доступу у спадщині C ++

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

Наразі ми використовували publicключове слово для того, щоб успадкувати клас від раніше існуючого базового класу. Однак ми також можемо використовувати ключові слова privateі protectedдля успадкування класів. Наприклад,

 class Animal ( // code ); class Dog : private Animal ( // code );
 class Cat : protected Animal ( // code );

Різні способи отримання класів відомі як режими доступу . Ці режими доступу мають такий ефект:

  1. public: Якщо похідний клас оголошено в publicрежимі, тоді члени базового класу успадковуються похідним класом так само, як вони.
  2. private: У цьому випадку всі члени базового класу стають privateчленами похідного класу.
  3. захищений: В publicчлени базового класу стають protectedчленами в похідному класі.

В privateчлени базового класу завжди privateв похідному класі.

Щоб дізнатись більше, відвідайте наш загальнодоступний приватний підручник із захищеною спадщиною на C ++.

Заміна функції члена у спадщині

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

Якщо ми створимо об'єкт похідного класу і спробуємо отримати доступ до цієї функції-члена, функція-член у похідному класі буде викликана замість тієї, що в базовому класі.

Функція-член похідного класу замінює функцію-член базового класу.

Дізнайтеся більше про перевизначення функцій у C ++.

Рекомендована література: Множинне успадкування C ++

Цікаві статті...