Pergunta

Embora eu tenha visto em casos raros onde privada a herança foi necessário, eu nunca encontrei um caso onde protegida a herança é necessária.Alguém tem um exemplo?

Foi útil?

Solução

As pessoas aqui parecem erro Protegido de herança de classe e métodos Protegidos.

FWIW, eu nunca vi ninguém unidades de conservação de uso de herança de classe, e se bem me lembro acho que Stroustrup, mesmo considerado o "protegido" nível de ser um erro em c++.Há muito pouco que você não pode fazer se você remover o nível de proteção e só dependem de público e privado.

Outras dicas

Não é muito raro caso de uso de unidades de herança.É onde você quer fazer uso de covariância:

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; 
    } 
}; 

O trecho de código anterior tentou esconder a sua base de classe, e fornecer controlada de visibilidade de bases e suas funções, por qualquer motivo, fornecendo um "getBase função".

No entanto, ele irá falhar na estrutura d2, já que d2 não sabe o que d1 é derivado a partir de base.Assim, covariance não vai funcionar.Uma maneira de sair deste está derivando-los protegidos, de modo que a herança é visível em d2.

Um exemplo semelhante de utilizar este é quando você derivar de std::ostream, mas não quero que pessoas aleatórias para escrever em seu stream.Você pode fornecer um virtual getStream função que retorna std::ostream&.Que função poderia fazer alguma preparação da corrente para a próxima operação.Por exemplo, colocar determinadas manipuladores em.

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

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

C++ FAQ Lite menções de um caso de uso privado, a herança é uma solução legítima (Ver [24.3.] O que devo preferir:composição ou privado de herança?).É quando você deseja chamar a classe derivada a partir de dentro de uma privada da base de dados de classe através de uma função virtual (neste 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() {
        // ...
    }

    // ...
};

Agora, se você deseja derivar da classe Derivada, e você deseja usar Base::service() de dentro da classe derivada (digamos que você deseja mover Derived::someFunction() para a classe derivada), a maneira mais fácil para fazer isso é alterar o privado, herança do Base para protegidas herança.

Desculpe, não consigo pensar em um exemplo mais concreto.Pessoalmente, eu gostaria de fazer todos os herança pública, de modo a evitar a perda de tempo com "eu deveria fazer com a herança relação protegido ou privado" as discussões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top