Pregunta

Si bien he visto casos raros en los que privado Se necesitaba herencia, nunca me he encontrado con un caso en el que protegido Se necesita herencia.¿Alguien tiene un ejemplo?

¿Fue útil?

Solución

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

FWIW, nunca he visto a nadie usar herencia de clases protegidas, y si no recuerdo mal, creo que Stroustrup incluso consideró que el nivel "protegido" era un error en c++.Es muy poco lo que no puedes hacer si eliminas ese nivel de protección y solo confías en lo público y lo privado.

Otros consejos

Existe un caso de uso muy raro de herencia protegida.Es donde quieres hacer uso de 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 visibilidad controlada de las bases y sus funciones, por cualquier motivo, proporcionando una función "getBase".

Sin embargo, fallará en la estructura. d2, desde d2 no sabe que d1 se deriva de base.De este modo, covariance no trabajará.Una forma de evitarlo es protegerlos, de modo que la herencia sea visible en d2.

Un ejemplo similar de uso de esto es cuando derivas de std::ostream, pero no quiero que personas aleatorias escriban en tus novedades.Puedes proporcionar un virtual getStream función que devuelve std::ostream&.Esa función podría preparar un poco la transmisión para la siguiente operación.Por ejemplo meter ciertos manipuladores.

std::ostream& d2::getStream() {
    this->width(10);
    return *this;
}

logger.getStream() << "we are padded";

Preguntas frecuentes sobre C++ Lite menciona un caso en el que utilizar la herencia privada es una solución legítima (Ver [24.3.] ¿Cuál debería preferir?¿Composición o herencia privada?).Es cuando quieres llamar a la clase derivada desde 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 desea derivar de la clase Derivada y desea usar 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 la herencia protegida.

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

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