В този урок ще научим за наследяването в C ++ с помощта на примери.
Наследяването е една от ключовите характеристики на обектно-ориентираното програмиране в C ++. Позволява ни да създадем нов клас (производен клас) от съществуващ клас (основен клас).
Производният клас наследява функциите от базовия клас и може да има свои собствени допълнителни функции. Например,
class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );
Тук Dog
класът е получен от Animal
класа. Тъй като Dog
е получено от Animal
, членовете на Animal
са достъпни за Dog
.
Забележете използването на ключовата дума, 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:
- 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. - private: In this case, all the members of the base class become
private
members in the derived class. - protected: The
public
members of the base class becomeprotected
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 ++ Множествено наследяване