resueltos que polimorfismo objeto metodos herencia encapsulamiento ejercicios ejemplos constructores codigo clases c++ oop inheritance

que - ¿Hay algún ejemplo donde*necesitamos*herencia protegida en C++?



polimorfismo en c++ (3)

Hay un caso de uso muy raro de herencia protegida. Es donde desea utilizar la covarianza :

struct base { virtual ~base() {} virtual base & getBase() = 0; }; struct d1 : private /* protected */ base { virtual base & getBase() { return this; } }; struct d2 : private /* protected */ d1 { virtual d1 & getBase () { return this; } };

El fragmento anterior intentó ocultar su clase base y proporcionar una visibilidad controlada de las bases y sus funciones, por la razón que sea, al proporcionar una función "getBase".

Sin embargo, fallará en la estructura d2 , ya que d2 no sabe que d1 se deriva de la base . Por lo tanto, la covariance no funcionará. Una forma de salir de esto es derivarlos protegidos, para que la herencia sea visible en d2.

Un ejemplo similar de usar esto es cuando deriva de std::ostream , pero no desea que personas aleatorias escriban en su transmisión. Puede proporcionar una función getStream virtual que devuelve std::ostream& . Esa función podría preparar un poco el flujo para la siguiente operación. Por ejemplo, poner ciertos manipuladores en

std::ostream& d2::getStream() { this->width(10); return *this; } logger.getStream() << "we are padded";

Aunque he visto casos excepcionales en los que se necesitaba herencia privada , nunca he encontrado un caso en el que se necesite una herencia protegida . ¿Alguien tiene un ejemplo?


Preguntas frecuentes sobre C ++ Lite menciona un caso en el que usar la herencia privada es una solución legítima (Ver [24.3.] ¿Qué prefiero: composición o herencia privada? ). Es cuando desea llamar a la clase derivada desde una clase base privada a través de una función virtual (en este caso derivedFunction() ):

class SomeImplementationClass { protected: void service() { derivedFunction(); } virtual void derivedFunction() = 0; // virtual destructor etc }; class Derived : private SomeImplementationClass { void someFunction() { service(); } virtual void derivedFunction() { // ... } // ... };

Ahora, si desea derivar de la clase Derivada, y desea utilizar Base::service() desde dentro de la clase derivada (digamos que desea mover Derived::someFunction() a la clase derivada), la forma más fácil de lograr esto es para cambiar la herencia privada de Base a herencia protegida.

Lo siento, no puedo pensar en un ejemplo más concreto. Personalmente, me gusta hacer pública toda la herencia a fin de evitar perder el tiempo con las discusiones "¿Debería hacer que la relación de herencia sea protegida o privada?".


La gente aquí parece confundir la herencia de clase protegida y los métodos protegidos.

FWIW, nunca he visto a nadie usar la herencia de clase protegida, y si mal no recuerdo, creo que Stroustrup incluso consideró que el nivel "protegido" es un error en c ++. Hay muy poco que no puedes hacer si eliminas ese nivel de protección y solo dependes de lo público y lo privado.