Каковы последствия защищенного?
Сама идея protected
- предоставить всем производным классам доступ к таким членам.
Хотя это очень гибкая языковая функция, она создает серьезный недостаток инкапсуляции, что побуждает нарушать принцип подстановки Лискова (точнее, ограничение истории, поскольку производный класс может изменитьсостояние базового объекта без прохождения через примитив базового класса).
Как избежать его недостатков?
Если вы хотите более сильную инкапсуляцию и ограниченный доступ, вам нужно перейти на private
.Это гарантирует, что к внутреннему состоянию базового класса можно получить доступ только через открытый интерфейс.(Обратите внимание, что, хотя он обеспечивает ограничение истории, он сам по себе не гарантирует LSP).И следствием этого является то, что ни один производный класс не получает доступ.Не на первом выводе, а не позже.
Вам нужна личная защита?
То, что вы хотите, является своего рода промежуточным звеном: слабая инкапсуляция, но не слишком слабая.Этого не существует в C ++.И я не уверен, что это усилит ваш дизайн.
Но если вам нужно это ограничение в исключительных случаях, можно найти обходной путь, поиграв с поиском имени:
class DerivedClass1 : public Base
{
private:
using Base::x;
// In DerivedClass1 you can still use x.
};
// But it will fail to compile in Derived2
Демо онлайн
Но лично я бы не советовал идти по этому пути.Это подвержено ошибкам (вы можете забыть using
в одном родном брате).Сообщения об ошибках компилятора могут вводить в заблуждение.И в любом случае, приватность дает более надежный дизайн.