Si bien he visto casos excepcionales en los que se necesitaba herencia privada, nunca he encontrado un caso en el que haya sido protegido herencia. ¿Alguien tiene un ejemplo?¿Hay algún ejemplo en el que * necesitamos * herencia protegida en C++?
Respuesta
Las personas aquí parecen 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 no recuerdo mal, creo que Stroustrup incluso consideró que el nivel "protegido" era 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.
C++ FAQ Lite menciona un caso en el que el uso de la herencia privada es una solución legítima (consulte [24.3.] Which should I prefer: composition or private inheritance?). Es cuando se quiere llamar a la clase derivada de dentro de 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 quieres que se derivan 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 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?".
pero eso no es lo que preguntó el afiche, preguntó sobre la herencia protegida. Ciertamente hay casos en los que desearía una herencia privada, aunque no demasiados. –
Hay un caso de uso muy raro de herencia protegida. Es la que desea hacer uso de covariance:
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 trató de ocultar su clase base, y proporcionar la visibilidad controlada de bases y sus funciones, por el motivo 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 base
. Por lo tanto, covariance
no funcionará. Una forma de salir de esto es derivarlos protegidos, para que la herencia sea visible en d2.
Un ejemplo similar de uso es cuando deriva de std::ostream
, pero no desea que personas aleatorias escriban en su transmisión. Puede proporcionar una función virtual getStream
que devuelva std::ostream&
. Esa función podría preparar un poco el flujo para la siguiente operación. Por ejemplo poniendo ciertos manipuladores en
std::ostream& d2::getStream() {
this->width(10);
return *this;
}
logger.getStream() << "we are padded";
- 1. ¿En qué casos necesitamos una herencia protegida?
- 2. ¿Por qué necesitamos herencia Privada o Protegida en C++?
- 3. herencia protegida
- 4. ¿Hay algún ejemplo de JSON Web Token (JWT) en C#?
- 5. función virtual en herencia privada o protegida
- 6. Casting de herencia privada/protegida
- 7. ¿Hay algún ejemplo de juegos en Scala?
- 8. Pobre ejemplo de herencia en C#
- 9. ¿Hay algún ejemplo en python-purple flotando alrededor?
- 10. ¿Hay algún proyecto de ejemplo que contenga Core Plot?
- 11. ¿Hay algún ejemplo en el framework .Net que use spinlock o spinwait?
- 12. ¿Hay algún ejemplo de sitios que utilizan el atributo de rol en HTML5/XHTML?
- 13. ¿Hay algún evento "en el cambio DOM"?
- 14. ¿Hay algún ejemplo de quadtrees en HTML5 Canvas?
- 15. Ejemplo simple de herencia C++, ¿qué ocurre?
- 16. ¿Hay algún programa que ofusque el código fuente de C#?
- 17. ¿Hay algún "patrón de diseño" en C?
- 18. Palabra clave protegida C#
- 19. Amazon Product API: ¿hay algún ejemplo válido y actualizado en C#?
- 20. ¿hay algún servidor web simple/de ejemplo impulsado por eventos en C?
- 21. ¿Herencia privada en C#?
- 22. ¿Hay algún libtorrent para C#?
- 23. ¿Hay algún ejemplo sobre texto extendido e Spannable?
- 24. ¿Cuál puede ser el mal ejemplo de herencia en Java?
- 25. Costos herencia en C++
- 26. ¿Hay algún ejemplo de funcionamiento de Zolera SOAP Infrastructure (ZSI)?
- 27. Herencia en C++
- 28. ¿Hay algún concepto en C++ como reflector en .Net?
- 29. ¿Hay algún analizador de cadenas de conexión en C#?
- 30. ¿Hay algún control de navegador web mejor en C# (.NET)?
Sólo un comentario rápido: apellido Mr. C++ 's es BS;) –
Buen Señor, lo arreglaré inmediatamente.! :) –