Перейти к основному содержимому

Наследование

Язык 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;
}