Pregunta

Tengo una pregunta basada en este pregunta

En la sección http://www.parashift.com/c%2B%2B-faq-lite/private-inheritance.html#faq-24.3 el siguiente es mencionado:

Legítimo, el uso a largo plazo de la herencia privada, es cuando se desea construir una clase a Fred que utiliza un código en una clase Wilma, y el código de la clase Wilma necesita invocar funciones de miembro de la nueva clase, Fred.En este caso, Fred llamadas no virtuals en Wilma, y Wilma llamadas (generalmente puro virtuals) en sí misma, que se reemplaza por Fred.Esto sería mucho más difícil de hacer con la composición.

Sin embargo, me gustaría saber por qué el uso público inheritence no se logrará el mismo efecto.yo.e el siguiente fragmento de código c# hace la misma cosa..

class Wilma
{
    protected void FredCallsWilma() {
        Console.Write("Fred Calls Wilma ;");
        WilmaCallsFred();
    }

    protected virtual void WilmaCallsFred() {}
}

class Fred : Wilma
{
    public void barney(){
        Console.Write("barney;");
        FredCallsWilma();
    }

    protected override void WilmaCallsFred(){
        Console.Write("Wilma Calls Fred ;");
    }
}

class Program
{
    static void Main(string[] args){
        Fred f1 = new Fred();
        f1.barney();
    }
}

Imprime

barney;Fred Llama Wilma ;Wilma Llama Fred

Entonces, ¿qué tiene de especial privado inheritence como se cita en el c++ faq lite.No sustituir público inheritence privado inheritence trabajo igual de bien, para lograr ese resultado?

¿Fue útil?

Solución

herencia Pública hace la clase base accesible para el mundo exterior. Por ejemplo, un puntero a la clase derivada puede ser convertido (implícitamente, no menos) a un puntero a la clase base. Considere una pila que se deriva de una lista enlazada. Por lo general, no me gustaría que alguien convertir implícitamente su matriz a su lista enlazada base, lo que les permitiría hacer las cosas no permitidas para una pila, como insertar o eliminar elementos en el medio.

El significado usual atribuido a la herencia privada es "se implementa en términos de" - lo que significa que normalmente no quieren permitir que el mundo / usuario externo para ver / saber / atención sobre el hecho de que esta clase tiene una clase base . patrimonio público debe seguir la regla de sustitución Liskov, que dice que una clase derivada puede ser sustituido en cualquier lugar de una clase base pública se pide. Con la herencia privada, estamos específicamente no decir que la clase derivada puede ser sustituido por la clase base.

herencia Pública es una técnica de diseño. Su intención es la de permitir que el código que está escrito para ser utilizado por otro código que ya sabe cómo trabajar con la interfaz presentado por la clase base.

herencia privada es una técnica de aplicación. Su intención es sólo para simplificar su aplicación utilizando el código de la clase base.

Otros consejos

Sí, estás en lo correcto. El párrafo citado sólo se está citando que las clases de los niños tienen acceso a miembros privados de clases inhereted, y un posible caso de uso para eso.

Algunas personas asumen incorrectamente que no se puede acceder a miembros privados de clases heredadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top