Наследование С++
Наследование C++
В этом уроке мы узнаем о наследовании в 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 <iostream>
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;
}
Вывод
I can eat! I can sleep! I can bark! Woof woof!!
Вот, собака1 (объект производного класса Dog
) может обращаться к членам базового класса Animal
. Это потому, что Dog
унаследован от Animal
.
// Calling members of the Animal class
dog1.eat();
dog1.sleep();
<час> Защищенные участники C++
Модификатор доступа protected
особенно актуален, когда речь идет о наследовании C++.
Нравится private
участники, protected
члены недоступны вне класса. Однако к ним могут обращаться производные классы. и классы/функции друзей .
Нам нужно protected
члены, если мы хотим скрыть данные класса, но по-прежнему хотим, чтобы эти данные были унаследованы его производными классами.
Чтобы узнать больше о protected, обратитесь к нашему руководству по модификаторам доступа C++.
<час>Пример 2:защищенные члены C++
// C++ program to demonstrate protected members
#include <iostream>
#include <string>
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;
}
Вывод
I can eat! I can sleep! I can bark! Woof woof!! I am a mammal My color is black
Здесь переменная type 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
ключевое слово скрывает данные, мы не можем получить доступ к type непосредственно из объекта Dog
или Animal
класс.
// Error: member "Animal::type" is inaccessible
dog1.type = "mammal";
<час> Режимы доступа в наследовании C++
В наших предыдущих руководствах мы узнали о спецификаторах доступа C++, таких как public, private и protected.
До сих пор мы использовали public
ключевое слово, чтобы наследовать класс от ранее существовавшего базового класса. Однако мы также можем использовать private
и protected
ключевые слова для наследования классов. Например,
class Animal {
// code
};
class Dog : private Animal {
// code
};
class Cat : protected Animal {
// code
};
Различные способы получения классов известны как режимы доступа. . Эти режимы доступа имеют следующий эффект:
- общедоступно: Если производный класс объявлен в
public
режиме, то члены базового класса наследуются производным классом так же, как они есть. - частное: В этом случае все члены базового класса становятся
private
членов производного класса. - защищено:
public
члены базового класса становятсяprotected
членов производного класса.
private
члены базового класса всегда private
в производном классе.
Чтобы узнать больше, посетите наш учебник по общедоступному, частному и защищенному наследованию C++.
<час>Переопределение функции-члена при наследовании
Предположим, что базовый класс и производный класс имеют функции-члены с одинаковыми именами и аргументами.
Если мы создадим объект производного класса и попытаемся получить доступ к этой функции-члену, вместо функции в базовом классе будет вызвана функция-член в производном классе.
Функция-член производного класса переопределяет функцию-член базового класса.
Узнайте больше о переопределении функций в C++.
<час>Рекомендуемое чтение: Множественное наследование C++
Язык C