Ahora que ya conoce la herencia, la palabra reservada protected cobra por fin sentido. En un mundo ideal, los miembros privados serían siempre estrictamente privados, pero en los proyectos reales hay ocasiones en que se desea ocultar algo al resto del mundo y, aun así, permitir el acceso a los miembros de las clases derivadas. La palabra reservada protected es una concesión al pragmatismo; dice: «Esto es privado en lo que respecta al usuario de la clase, pero está disponible para cualquiera que herede de esta clase».
Lo mejor es dejar los atributos privados; siempre debe preservar su derecho a cambiar la implementación subyacente. Después puede permitir un acceso controlado a los herederos de su clase a través de funciones miembro protegidas:
//: C14:Protected.cpp // The protected keyword #include <fstream> using namespace std; class Base { int i; protected: int read() const { return i; } void set(int ii) { i = ii; } public: Base(int ii = 0) : i(ii) {} int value(int m) const { return m*i; } }; class Derived : public Base { int j; public: Derived(int jj = 0) : j(jj) {} void change(int x) { set(x); } }; int main() { Derived d; d.change(10); } ///:~
Listado 14.15. C14/Protected.cpp
Encontrará ejemplos de la necesidad de protected más adelante en este libro y en el Volumen 2.
Cuando se hereda, la clase base es privada por defecto, lo que significa que todas las funciones miembro públicas son privadas para el usuario de la nueva clase. Normalmente, heredará de forma pública para que la interfaz de la clase base sea también la interfaz de la clase derivada. Sin embargo, también puede usar la palabra reservada protected durante la herencia.
Derivar de forma protegida significa «implementado en términos de» para otras clases, pero «es-un» para las clases derivadas y las amigas. Es algo que no se utiliza muy a menudo, pero está en el lenguaje para que éste sea completo.