Es útil cuando desea tener acceso a algunos miembros de la clase base, pero sin exponerlos en su interfaz de clase. herencia privada también puede ser visto como una especie de composición: la C++ faq-lite da el siguiente ejemplo para ilustrar esta afirmación
class Engine {
public:
Engine(int numCylinders);
void start(); // Starts this Engine
};
class Car {
public:
Car() : e_(8) { } // Initializes this Car with 8 cylinders
void start() { e_.start(); } // Start this Car by starting its Engine
private:
Engine e_; // Car has-a Engine
};
Para obtener la misma semántica, también se podría escribir la categoría de coches de la siguiente manera:
class Car : private Engine { // Car has-a Engine
public:
Car() : Engine(8) { } // Initializes this Car with 8 cylinders
using Engine::start; // Start this Car by starting its Engine
};
Sin embargo, esta manera de hacer tiene varias desventajas:
- su intención es mucho menos claro
- que puede conducir a la herencia múltiple abusiva
- se rompe la encapsulación de la clase del motor ya que se puede acceder a sus miembros protegidos
- se le permite reemplazar los métodos virtuales del motor, que es algo que no desea si su objetivo es una composición simple
Considere esto: un círculo es una elipse pero [el círculo no es sustituible para Ellipse] (http://stackoverflow.com/questions/7602102/teach-dynamic-polymorphism-with-simple-example/7677015#7677015), la herencia pública es *** no *** y es una relación, aunque a menudo lo llamamos así. – spraff
El círculo es de hecho una elipse. ¿No estoy seguro de lo que quieres decir? –