Existem exemplos que *precisa* protegido de herança em C++?
-
09-06-2019 - |
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?
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.