Наследяване на C ++

В този урок ще научим за наследяването в C ++ с помощта на примери.

Наследяването е една от ключовите характеристики на обектно-ориентираното програмиране в C ++. Позволява ни да създадем нов клас (производен клас) от съществуващ клас (основен клас).

Производният клас наследява функциите от базовия клас и може да има свои собствени допълнителни функции. Например,

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

Тук Dogкласът е получен от Animalкласа. Тъй като Dogе получено от Animal, членовете на Animalса достъпни за Dog.

Наследяване в C ++

Забележете използването на ключовата дума, publicдокато наследявате Dog от Animal.

 class Dog : public Animal (… );

Можем да използваме и ключовите думи privateи protectedвместо public. Ще научите повече за разликите между използване private, publicи protectedпо-късно в този урок.

е-връзка

Наследяването е връзка . Използваме наследяване само ако има връзка между двете класове.

Ето няколко примера:

  • Колата е превозно средство.
  • Портокалът е плод.
  • Хирургът е лекар.
  • Кучето е животно.

Пример 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; )

Изход

Мога да ям! Аз мога да спя! Мога да лая! Уууууууф !!

Тук dog1 (обектът на производен клас Dog) може да има достъп до членове на базовия клас Animal. Това е така, защото Dogе наследено от Animal.

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

C ++ защитени членове

Модификаторът на достъп protectedе особено подходящ, когато става въпрос за наследяване на C ++.

Подобно на privateчленовете, protectedчленовете са недостъпни извън класа. Те обаче могат да бъдат достъпни от производни класове и класове / функции на приятели .

Нуждаем се от protectedчленове, ако искаме да скрием данните на даден клас, но все пак искаме тези данни да бъдат наследени от неговите производни класове.

За да научите повече за защитените, вижте нашия урок за модификатори на C ++ Access.

Пример 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; )

Изход

Мога да ям! Аз мога да спя! Мога да лая! Уууууууф !! Аз съм бозайник. Цветът ми е черен

Тук типът на променливата е 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 );

The various ways we can derive classes are known as access modes. These access modes have the following effect:

  1. public: If a derived class is declared in public mode, then the members of the base class are inherited by the derived class just as they are.
  2. private: In this case, all the members of the base class become private members in the derived class.
  3. protected: The public members of the base class become protected members in the derived class.

The private members of the base class are always private in the derived class.

To learn more, visit our C++ public, private, protected inheritance tutorial.

Member Function Overriding in Inheritance

Да предположим, че базовият клас и производният клас имат функции-членове със същото име и аргументи.

Ако създадем обект от производния клас и се опитаме да осъществим достъп до тази член-функция, членната функция в производния клас се извиква вместо тази в основния клас.

Функцията член на производен клас заменя функцията член на базовия клас.

Научете повече за заменяне на функции в C ++.

Препоръчително четене: C ++ Множествено наследяване

Интересни статии...