Для любого класса существует два вида использования клиентским кодом: код, который ссылается на ваш класс, и код, который наследует ваш класс. Широко признано, что второй вид использования, безусловно, наиболее тесно связан. Изменения в вашем классе напрямую влияют на их внутреннюю механику. Такое предоставление защищенных членов, как это, означает, что изменения в вашем базовом классе будут влиять на работу ваших производных классов непредсказуемым образом без сравнения кода каждого базового и производного класса. В равной степени плохо, ваши производные классы могут изменять внутренние компоненты базового класса.
Если вы действительно хотите выставлять внутренние элементы данных, как это, оберните частные элементы данных в защищенные свойства (как предлагает gisresearch). Эти свойства (вместе с любыми защищенными методами) составляют интерфейс наследования вашего класса. Как и любой интерфейс, предоставляемый внешним клиентам (будь то просто путем определения общедоступных методов и свойств или явной реализации интерфейса), этим интерфейсом вам нужно будет управлять, особенно в больших кодовых базах. Интерфейс может быть изменен, но должен быть изменен как осознанное решение.
Если вы работаете с защищенными членами данных напрямую, вы гораздо меньше контролируете зависимости между базовым и производным классами. Поверьте мне: даже неспособность определить, какие последствия могут иметь изменения, может быть очень неприятной вещью.