Efectivamente. Dada esas dos clases, donde PrivatHer
hereda privadamente de Base
:
class Base {
public:
int isPublic;
};
class PrivateHer : Base {
};
Entonces lo siguiente da error:
PrivateHer pr;
auto a3 = pr.isPublic;
Y además no hay polimorfismo. Es decir:
Base b;
PrivateHer ph;
Base *pb = &b;
pb = &ph;
pb = static_cast<Base*>(&ph);
(Si la herencia fuese pública no tendríamos esos dos errores)
Esa es la pregunta típica. De hecho es tan típica que hasta la FAQ de C++ la responde1 El resúmen sería:
Use composition when you can, private inheritance when you have to
Vale, eso no explica las diferencias, pero ya deja claro que no es lo mismo. La herencia privada se diferencia de la composición en dos aspectos básicos: el primero es que te da acceso a las variables protegidas de la clase que heredas. Esa es la restricción: deberíamos usar solo herencia privada si requerimos acceso a las variables protegidas de la clase heredada. Eso abre algunos escenarios que serían bastante más complejos sin tener herencia privada. La otra diferencia es más técnica y es que en herencia privada el "objeto" correspondiente a la clase que heredamos se crea como parte de la cadena de constructores (en composición tenemos el control de como creamos los objetos que nos componen). Por lo que a C++ concierne la herencia privada es herencia, y técnicamente es tratada como tal, pero no se trata de una relación is-a.
En resúmen, la herencia privada es una herramienta más del lenguaje, de la que no se debe abusar (si lo hacemos, probablemente, tenemos algún problema en el diseño de las clases). Y, simplemente, la puse como ejemplo de que herencia no siempre tiene por qué implicar polimorfismo