Некоторые сценарии, в которых вы хотите защитить:
У вас есть базовый класс с методами, которые, как вы знаете, никогда не хотят раскрывать функциональность снаружи, но, как вы знаете, будут полезны для любого производного класса.
У вас есть базовый класс с членами, которые должны логически использоваться любым классом, который расширяет этот класс, но никогда не должен отображаться снаружи.
Благодаря множественному наследованию вы можете поиграться с типом наследования базовых классов и создать более разнообразный класс с существующей логикой и реализацией.
Более конкретный пример:
Вы можете создать несколько абстрактных классов, которые следуют логике шаблона проектирования, скажем, у вас есть:
Observer
Subject
Factory
Теперь вы хотите, чтобы все это было общедоступным, поскольку в общем случае вы можете использовать шаблон для чего угодно.
Но с помощью защищенного наследования вы можете создать класс, который является Observer и Subject, но только защищенной фабрикой, поэтому фабричная часть используется только в унаследованных классах. (Просто выбрал случайные паттерны для примера)
Другой пример:
Допустим, например, что вы хотите наследовать от библиотечного класса (не то, чтобы я это поощрял). Допустим, вы хотите сделать свое собственное классное расширение std::list<>
или «лучше» shared_ptr
.
Вы можете получить защиту от базового класса (который предназначен для открытых методов).
Это даст вам возможность использовать ваши собственные пользовательские методы, использовать логику класса и передавать логику в любой производный класс.
Возможно, вы могли бы использовать вместо этого инкапсуляцию, но наследование следует правильной логике IS A
(или в этом случае это своего рода А)