Al hacer que la herencia sea privada, básicamente dice que incluso el hecho de que B hereda de A (en absoluto) es privado, no accesible/visible para el mundo exterior.
Sin entrar en una discusión larga de lo que sucedería si se permitiera, el hecho es que no está permitido. Si desea utilizar un puntero a la base para referirse a un objeto de tipo derivado, entonces está prácticamente atrapado en el uso de la herencia pública.
Editar: Desde que alguien se tomó la molestia de enviar un correo electrónico para pedir más información sobre lo que podría pasar si esto se permitiera, supongo que elaboraré un poco sobre él.
El problema básico es que la herencia privada es no necesariamente destinada a seguir el Liskov substitution principle. La herencia pública afirma que un objeto derivado puede sustituirse por un objeto de la clase base, y la semántica propia dará como resultado. La herencia privada no no afirman eso sin embargo. La descripción habitual de la relación implícita en la herencia privada es "se implementa en términos de".
Herencia pública significa que una clase derivada mantiene todas las capacidades de la clase base y potencialmente agrega más. La herencia privada a menudo significa más o menos lo contrario: que la clase derivada utiliza una clase base general para implementar algo con una interfaz más restringida.
Solo por ejemplo, supongamos por el momento que los contenedores en la biblioteca estándar de C++ se implementaron usando herencia en lugar de plantillas. En el sistema actual, std::deque
y std::vector
son contenedores, y std::stack
es un adaptador de contenedor que proporciona una interfaz más restringida. Dado que está basado en plantillas, puede usar std::stack
como un adaptador para std::deque
o std::vector
.
Si quisiéramos proporcionar esencialmente la misma con la herencia, probablemente hubiéramos utilizar la herencia privada, por lo std::stack
sería algo así como:
class stack : private vector {
// ...
};
En este caso, no cabe duda hacemos no desea que el usuario ser capaz de manipular nuestro stack
como si fuera un vector
. Hacerlo podría (y probablemente) violar las expectativas de una pila (por ejemplo, el usuario podría insertar/quitar elementos en el medio, en lugar de una manera puramente apilada según lo previsto). Básicamente estamos usando vector
como una forma conveniente de implementar nuestra pila, pero si (por ejemplo) cambiamos la implementación para stack
por separado (sin dependencia de una clase base) o la implementamos en términos de std::deque
, lo hacemos no quiere que afecte a cualquier código de cliente: para el código de cliente, se supone que es solo una pila, no una variedad especializada de vector (o deque).
Gracias, pero de alguna manera no tiene sentido. 'El único negocio de 'privado' debe ser controlar cómo se comportan los miembros. ¿Cuál sería el daño si la información de herencia no está oculta? – Lazer
La herencia privada es una forma de agregación/composición. Es una forma de * tener * las propiedades de una clase base, sin * ser * un objeto de la clase base. Si eso no es lo que quieres, la herencia privada no es para ti. Así es como funciona. – tmpearce