Ключевое слово protected
Ключевое слово protected используется в объявлении класса для указания уровня доступа к его членам: полям и методам. Члены, помеченные как protected, доступны внутри самого класса, а также внутри классов-наследников. Из внешнего кода (например, из функции main) к таким членам обратиться нельзя. Это делает protected удобным инструментом для реализации наследования, когда нужно скрыть детали реализации от посторонних, но оставить их доступными для потомков.
Синтаксис
class ClassName
{
protected:
// поля и методы, доступные классу и наследникам
};
Пример
Давайте создадим базовый класс Animal с защищенным полем name и защищенным методом getName. Затем создадим наследника Dog, который обращается к этому полю через унаследованный метод:
#include <iostream>
#include <string>
using namespace std;
class Animal
{
protected:
string name;
string getName()
{
return name;
}
};
class Dog : public Animal
{
public:
Dog(string n)
{
name = n;
}
void printName()
{
cout << getName() << endl;
}
};
int main()
{
Dog dog("Rex");
dog.printName();
return 0;
}
Результат выполнения кода:
"Rex"
Пример
Попробуем обратиться к защищенному полю name напрямую из функции main. Такой код не скомпилируется, потому что protected запрещает доступ извне класса и его наследников:
#include <iostream>
#include <string>
using namespace std;
class Animal
{
protected:
string name;
};
int main()
{
Animal animal;
animal.name = "Rex"; // error: 'name' is protected
return 0;
}
Результат выполнения кода:
error: 'std::string Animal::name' is protected within this context
Пример
Покажем, что защищенный метод getName также недоступен из внешнего кода, даже если объект имеет тип наследника:
#include <iostream>
#include <string>
using namespace std;
class Animal
{
protected:
string getName()
{
return "abcde";
}
};
class Dog : public Animal
{
};
int main()
{
Dog dog;
cout << dog.getName() << endl; // error: 'getName' is protected
return 0;
}
Результат выполнения кода:
error: 'std::string Animal::getName()' is protected within this context
Смотрите также
-
ключевое слово
public,
которое открывает доступ к членам класса всем -
ключевое слово
private,
которое закрывает доступ к членам класса от всех -
ключевое слово
friend,
которое дает доступ к закрытым членам класса -
механизм
наследования,
который тесно связан с уровнем доступа protected