Выбрать главу
Понятие о наследовании

Базовый класс наследуется производным классом.

Язык C++ поддерживает механизм наследования, позволяя в объявление класса встраивать другой класс. Для этого базовый класс задается при объявлении производного. Лучше всего начать с примера. Рассмотрим класс road_vehicle, который в самых общих чертах определяет дорожное транспортное средство. Его члены данных позволяют хранить количество колес и число пассажиров, которое может перевозить транспортное средство.

class road_vehicle {

  int wheels;

  int passengers;

 public:

  void set_wheels(int num) { wheels = num; }

  int get_wheels() { return wheels; }

  void set_pass(int num) { passengers = num; }

  int get_pass() { return passengers; }

};

Это общее определение дорожного транспортного средства можно использовать для определения конкретных типов транспортных средств. Например, в следующем фрагменте путем наследования класса road_vehicle создается класс truck (грузовых автомобилей).

class truck : public road_vehicle {

  int cargo;

 public:

  void set_cargo(int size) { cargo = size; }

  int get_cargo() { return cargo; }

  void show();

};

Тот факт, что класс truck наследует класс road_vehicle, означает, что класс truck наследует все содержимое класса road_vehicle. К содержимому класса road_vehicle класс truck добавляет член данных cargo, а также функции-члены, необходимые для поддержки члена cargo.

Обратите внимание на то, как наследуется класс road_vehicle. Общий формат для обеспечения наследования имеет следующий вид.

class имя_производного_класса : доступ имя_базового_класса

{

 тело нового класса

}

Здесь элемент доступ необязателен. При необходимости он может быть выражен одним из спецификаторов доступа: public, private или protected. Подробнее об этих спецификаторах доступа вы узнаете ниже в этой главе. А пока в определениях всех наследуемых классов мы будем использовать спецификатор public. Это означает, что все public-члены базового класса также будут public-членами производного класса. Следовательно, в предыдущем примере члены класса truck имеют доступ к открытым функциям-членам класса road_vehicle, как будто они (эти функции) были объявлены в теле класса truck. Однако класс truck не имеет доступа к private-членам класса road_vehicle. Например, для класса truck закрыт доступ к члену данных wheels.

Рассмотрим программу, которая использует механизм наследования для создания двух подклассов класса road_vehicle: truck и automobile.

// Демонстрация наследования.

#include <iostream>

using namespace std;

// Определяем базовый класс транспортных средств.

class road_vehicle {

  int wheels;

  int passengers;

 public:

  void set_wheels(int num) { wheels = num; }

  int get_wheels() { return wheels; }

  void set_pass(int num) { passengers = num; }

  int get_pass() { return passengers; }

};

// Определяем класс грузовиков.

class truck : public road_vehicle {

  int cargo;

 public:

  void set_cargo(int size) { cargo = size; }

  int get_cargo() { return cargo; }

  void show();

};

enum type {car, van, wagon};

// Определяем класс автомобилей.

class automobile : public road_vehicle {

  enum type car_type;

 public:

  void set_type(type t) { car_type = t; }

  enum type get_type() { return car_type; }

  void show();

};

void truck::show()