Наследование
Язык C++ позволяет классу наследовать переменные-члены и методы одного или нескольких других классов. Новый класс называют производным классом. Класс, элементы которого наследуются производным классом, называется базовым классом. В свою очередь производный класс может служить базовым для другого класса. Общий вид наследования:
class Base {
// ...
};
class Derived : <ключ доступа> Base {
// ...
};
Ключ доступа может быть private
, protected
, public
. Если ключ не указан, то по умолчанию он принимается private
.
Наследование даст возможность заключить некоторое общее или схожее поведение различных объектов в одном базовом классе.
Наследование позволяет также изменить поведение существующего класса. Производный класс может переопределить некоторые методы базового, наследуя, тем не менее, основной объем свойств и атрибутов базового класса. С помощью наследования может быть создана иерархия классов, которые совместно используют код и интерфейсы.
Наследуемые компоненты не перемещаются в производный класс, а остаются в базовых классах.
В иерархии производный объект наследует разрешенные для наследования компоненты всех базовых объектов (public
, protected
).
Допускается множественное наследование - возможность для некоторого класса наследовать компоненты нескольких никак не связанных между собой базовых классов. В иерархии классов соглашение относительно доступности компонентов класса следующее:
private
- член класса может использоваться только функциями-членами данного класса и функциями-"друзьями" своего класса. В производном классе он недоступен.protected
- то же, что иprivate
, но дополнительно член класса с данным атрибутом доступа может использоваться функциями-членами и функциями-"друзьями" классов, производных от данного (при наследованииpublic
иprotected
).public
- член класса может использоваться любой функцией, которая является членом данного или производного класса, а также кpublic
- членам возможен доступ извне через имя объекта (при наследованииpublic
иprotected
).
Следует иметь в виду, что объявление friend
не является атрибутом доступа и не наследуется.
Наследование позволяет рассматривать целые иерархии классов и работать со всеми элементами одинаково, приводя их к базовому. Правила приведения следующие:
- наследуемый класс всегда можно привести к базовому;
- базовый класс можно привести к наследуемому, только если в действительности это объект наследуемого класса.
Ошибки приведения базового класса к наследуемому отслеживаются программистом.
Синтаксис определения производного класса:
class имя_класса : список_базовых_классов {список_компонентов_класса};
В приведенном ниже примере показано определение наследования классов и доступа к членам базового класса через объект производного класса:
#include <iostream>
using namespace std;
class Base {
public:
int n;
int count() { return ++n; }
};
class Derived : public Base {
public:
int m;
int discount() { return --m; }
};
int main() {
setlocale(LC_ALL, "Russian");
Derived d;
d.n = 10;
cout << d.count() << endl;
d.m = 20;
cout << d.discount() << endl;
return 0;
}