В этом руководстве мы узнаем о наследовании в 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
члены, если мы хотим скрыть данные класса, но все же хотим, чтобы эти данные унаследовались его производными классами.
Чтобы узнать больше о protected, обратитесь к нашему руководству C ++ Access Modifiers.
Пример 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 );
Различные способы получения классов известны как режимы доступа . Эти режимы доступа имеют следующий эффект:
- public: если производный класс объявлен в
public
режиме, то члены базового класса наследуются производным классом, как и они. - private: в этом случае все члены базового класса становятся
private
членами производного класса. - защищенный: В
public
члены базового класса становятсяprotected
членами в производном классе.
В private
члены базового класса всегда private
в производном классе.
Чтобы узнать больше, посетите наш учебник по общедоступному, частному, защищенному наследованию C ++.
Переопределение функции-члена при наследовании
Предположим, базовый класс и производный класс имеют функции-члены с одинаковыми именами и аргументами.
Если мы создаем объект производного класса и пытаемся получить доступ к этой функции-члену, функция-член в производном классе вызывается вместо функции в базовом классе.
Функция-член производного класса переопределяет функцию-член базового класса.
Узнайте больше о переопределении функций в C ++.
Рекомендуемая литература: множественное наследование в C ++