Hacer algo 'público' crea un contrato que será vinculante para todas las clases heredadas. Hacer algo 'protegido' crea un contrato con directamente-clases heredadas, pero no obliga a las clases a hacer que dicho contrato esté disponible para ninguno de sus descendientes.
Si uno espera que el código fuente de una clase base esté disponible para cualquiera que herede de él, y espera que la clase base nunca cambie (normalmente esto significa que la razón para usar la clase base es permitir miembros públicos y propiedades de la clase base para usar indistintamente con clases derivadas, en lugar de reducir la cantidad de código necesario para las clases derivadas) y si todos los métodos públicos son virtuales o están directamente relacionados con los métodos virtuales, no hay mucha desventaja para utilizando campos protegidos en lugar de getters/setters virtuales protegidos. Si una clase descendiente necesita cambiar la forma en que se usan los campos, simplemente puede anular todos los métodos que los usan.
Si se espera que las clases derivadas se puedan crear en situaciones donde las clases superiores a ellas en la jerarquía no se conocen completamente o no son inmutables, entonces puede ser más apropiado tener getters/setters protegidos, pero esa responsabilidad podría ser izquierda con quien crea las capas "opacas" en la jerarquía.
Ejemplo: una colección puede mantener un campo llamado 'conteo'. Una versión base de la colección puede almacenar cosas de manera que sea fácil mantener un campo que siempre contenga la cantidad de elementos, pero una versión derivada puede almacenar cosas de una manera que lo haga difícil. Al tener un campo llamado "recuento", la clase base promete a sus descendientes directos que mantendrá la cantidad de elementos en ese campo. Una clase derivada podría almacenar las cosas de manera diferente, de modo que un campo de "conteo" no era significativo.Tal clase podría sombrear el campo de conteo con una propiedad de solo lectura; sus descendientes sabrían que tenían que leer una propiedad, mientras que los descendientes de la clase original sabrían que podían leer un campo.
El punto más importante es que las cosas protegidas en una clase sólo crean un contrato con descendientes directos, y los descendientes pueden decidir si debe o no hacer un contrato similar disponible para los sub-descendientes.
Addendum: lo único que se gana al agregar objetos de protección y modificadores virtuales protegidos es la capacidad de las clases derivadas de cambiar cómo el código de clase base accede a los campos/propiedades. Algunas veces esto será necesario, pero más a menudo creará problemas. Por ejemplo, si una colección puede eliminar frecuentemente elementos recientemente agregados, una clase derivada puede envolver cosas para que los últimos artículos agregados se guarden en una pequeña colección "adicional" y se transfieran a la colección principal después de que se agreguen elementos adicionales suficientes. El código para la colección principal esperará su propio campo de "conteo" para indicar cuántos elementos hay en la colección principal. Si una clase descendiente anula la propiedad "conteo" para incluir sus propios elementos, el código principal se romperá. La clase descendiente debería en su lugar sombra el campo de conteo para que sus descendientes verán un recuento que incluye los elementos de bonificación, pero la clase base aún verá el recuento que solo incluye sus propios elementos.
¿Por qué crees que las variables miembro se necesitarán más adelante en las clases derivadas? ¿Para qué se necesitarán y por qué necesitarán estar expuestos? –