2010-01-19 10 views
10

¿Por qué se definen y proponen la herencia privada y protegida? Entiendo que algunos casos de herencia privada podrían ser utilizados, pero no es recomendable. ¿Qué hay de la herencia protegida?herencia protegida

¿Alguien me puede ofrecer una situación en la que la herencia protegida es una opción?

Casi nunca veo esto.

¡Muchas gracias!

Respuesta

6

La herencia privada se utiliza generalmente para mixins --- donde las personas heredan para obtener la funcionalidad de la clase base, en lugar de debido a la herencia "is-a".

La herencia protegida también se puede usar para mixins, donde la funcionalidad mixta también estará disponible para las clases posteriores.

+0

me puede dar un ejemplo de protección herencia, por ejemplo, para la herencia privada, generalmente se utiliza el automóvil privado heredado del motor. – skydoor

+1

+1. Es decir, creo que es el único uso para la herencia protegida. –

+3

Coche 'tiene-un 'motor. Entonces, idealmente, se debe usar 'composition' y no' inheritance'. En general, uno debe usar la herencia cuando la relación es 'is-a'. Solo mis 2 centavos. – CodeRain

5

Generalmente no uso protected herencia. De hecho, generalmente no uso la herencia private. Si algo no satisface el Principio de Sustitución de Liskov, entonces no veo una razón para usar herencia de ningún tipo; y si satisface LSP, entonces usa public herencia.

Sin embargo, el lenguaje distingue entre private y protected solo desde el punto de vista de la clase (es decir, el código que utiliza la clase no puede distinguir).

Debe utilizar protected herencia cuando want it's semantics, y se debe utilizar private cuando no se desea protected.

+1

Si algo usa herencia privada, entonces desde el punto de vista de no amigos, no hereda de la base y por lo tanto, ciertamente no satisface LSP.La herencia privada es para cuando la herencia es un detalle de implementación, no parte de la interfaz pública. Entonces tal vez * podría * satisfacer a LSP, quizás no, pero de cualquier manera no quieres que lo haga. –

+0

El enlace dice que se deniega el acceso. –

+0

Gracias por el informe sobre el enlace; Apunté el enlace en las semi-preguntas oficiales C++ Super. –

1

Esta es una situación que yo usaría la herencia protegida

Base -> Derived1 -> Derived2

  • no quiero Derived1 a ser sustituida por la clase Base
  • Quiero usar la funcionalidad de base y también permite que el Derived2 lo use sin exponer la funcionalidad a las clases de cliente
+0

¿Puedes dar algunos ejemplos? Thks – coelhudo