Спецификатор protected
можно использовать не только для придания членам класса статуса "защищенности", но и для наследования базового класса. Если базовый класс наследуется как защищенный, все его открытые и закрытые члены становятся защищенными членами производного класса. Рассмотрим пример.
// Демонстрация наследования защищенного базового класса.
#include
using namespace std;
class base {
int i;
protected:
int j;
public:
int k;
void seti(int a) { i = a; }
int geti() { return i; }
};
// Наследуем класс 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
using namespace std;
class base1 {
protected:
int x;
public:
void showx() { cout << x << "\n"; }
};
class base2 {
protected:
int y;
public:
void showy() { cout << у << "\n"; }
};