Выбрать главу

// Наследуем класс base как protected-класс.

class derived : protected base {

 public:

  void setj(int a) { j = a; } // j — здесь protected-член

  void setk(int a) { k = a; } // k — здесь protected-член

  int getj() { return j; }

  int getk() { return k; }

};

int main()

{

 derived ob;

 /* Следующая строка неправомочна, поскольку функция seti() является protected-членом класса derived, что делает ее недоступной за его пределами. */

 // ob.seti (10);

 // cout << ob.geti(); // Неверно, поскольку функция geti() — protected-член.

 //ob.k=10; // Неверно, поскольку переменная k — protected-член.

 // Следующие инструкции правомочны.

  ob.setk(10);

  cout << ob.getk() << ' ';

  ob.setj(12);

  cout << ob.getj() << ' ';

  return 0;

}

Как отмечено в комментариях к этой программе, члены (класса base) k, j, seti() и geti() становятся protected-членами класса derived. Это означает, что к ним нельзя получить доступ из кода, "прописанного" вне класса derived. Поэтому ссылки на эти члены в функции main() (через объект ob) неправомочны.

Об использовании спецификаторов public, protected и private

Поскольку права доступа, определяемые спецификаторами public, protected и private, принципиальны для программирования на C++, имеет смысл обобщить все, что мы уже знаем об этих ключевых словах.

При объявлении члена класса открытым (с использованием ключевого слова public) к нему можно получить доступ из любой другой части программы. Если член класса объявляется закрытым (с помощью спецификатора private), к нему могут получать доступ только члены того же класса. Более того, к закрытым членам базового класса не имеют доступа даже производные классы. Если же член класса объявляется защищенным (protected-членом), к нему могут получать доступ только члены того же или производных классов. Таким образом, спецификатор protected позволяет наследовать члены, но оставляет их закрытыми в рамках иерархии классов.

Если базовый класс наследуется с использованием ключевого слова public, его public-члены становятся public-членами производного класса, а его protected-члены — protected-членами производного класса.

Если базовый класс наследуется с использованием спецификатора protected, его public- и protected-члены становятся protected-членами производного класса.

Если базовый класс наследуется с использованием ключевого слова private, его public- и protected-члены становятся private-членами производного класса.

Во всех случаях private-члены базового класса остаются закрытыми в рамках этого класса и не наследуются.

По мере увеличения вашего опыта в программировании на C++ применение спецификаторов public, protected и private не будет доставлять вам хлопот. А пока, если вы еще не уверены в правильности использования того или иного спецификатора доступа, напишите простую экспериментальную программу и проанализируйте полученные результаты.

Наследование нескольких базовых классов

Производный класс может наследовать два или больше базовых классов. Например, в этой короткой программе класс derived наследует оба класса base1 и base2.

// Пример использования нескольких базовых классов.

#include <iostream>

using namespace std;

class base1 {

 protected:

  int x;

 public:

  void showx() { cout << x << "\n"; }

};

class base2 {

 protected:

  int y;

 public:

  void showy() { cout << у << "\n"; }

};

// Наследование двух базовых классов.

class derived: public base1, public base2 {