Модификатор доступа protected служит для указания защищенных членов класса. Для производных классов и класса в котором определены защищенные члены класса они имеют доступ аналогичный public, для остальной области видимости аналогичный private.
#include <iostream> // cout, endl
using namespace std;
class My_class{ // Объявление и определение класса My_class
protected: // Объявление защищенных членов класса
int a = 10; // Защищенная целочисленная переменная
int get_a(){ // Защищенная функция
return a; // К защищенным членам можно обращаться внутри класса
}
int b = get_a(); // К защищенным членам можно обращаться внутри класса
int c = a; // К защищенным членам можно обращаться внутри класса
public: // Объявление открытых членов класса
int d = 10; // Открытая целочисленная переменная
void print_d(){ // Открытая функция
cout << d << endl; // Вывод значения переменной d
}
};
class My_child_class : public My_class{ // Объявление и определение класса My_child_class производного от класса My_class, с возможностью использовать публичные члены базового класса
public: // Объявление открытых членов класса
int get_child_a(){ // Объявили открытую функцию
return My_class::a; // В производном классе можно обращаться к защищенным членам родительского класса
}
};
int main(){
My_child_class obj; // Создали объект obj класса My_class
// int s = obj.a; // Ошибка! Нельзя обращаться к защищенным членам класса (к переменной а)
// int si = obj.get_a(); // Ошибка! Нельзя обращаться к защищенным членам класса (к функции get_a() )
// int siz = obj.b; // Ошибка! Нельзя обращаться к защищенным членам класса (к переменной b)
// int size = obj.c; // Ошибка! Нельзя обращаться к защищенным членам класса (к переменной c)
int dd = obj.d; // Можно использовать открытые члены от базового класса (переменную d)
obj.d = 20; // Можно использовать открытые члены от базового класса и для записи (переменную d)
obj.print_d(); //20 Можно использовать открытые члены от базового класса (функцию print_d() )
obj.d = obj.get_child_a(); // Присвоили переменной d результат вызова функции производного класса
obj.print_d(); //10
}