Diferença entre herança privada, pública e protegida

Qual é a diferença entre herança "pública", "privada" e "protegida" em C++? Todas as perguntas I'encontradas em SO lidam com casos específicos.

Solução

Para responder a essa pergunta, gostaria de descrever os acessores dos membros primeiro com minhas próprias palavras. Se você já sabe disso, pule para o título "próximo:".

Há três acessores que eu conheço: "público", "protegido" e "privado".

Vamos:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};
  • Tudo o que está ciente de "Base" também está ciente de que "Base" contém "Membro público".
  • Apenas as crianças (e seus filhos) estão cientes de que "Base" contém "Membro protegido".
  • Ninguém além da Base está ciente de Member privado.

Por "está consciente", quero dizer "reconhece a existência de, e assim poder aceder".

a seguir:

O mesmo acontece com a herança pública, privada e protegida. Vamos considerar uma classe 'Base' e uma classe 'Criança' que herda de 'Base'.

  • Se a herança é "pública", tudo o que está ciente de "Base" e "Criança" também está ciente de que "Criança" herda de "Base".
  • Se a herança é "protegida", apenas "Criança", e seus filhos, estão cientes de que eles herdam da "Base".
  • Se a herança é "privada", ninguém além do "Filho" está ciente da herança.
Comentários (12)

Tem a ver com a forma como os membros públicos da classe base são expostos a partir da classe derivada.

  • público -> os membros públicos da classe base serão públicos (geralmente o padrão)
  • proteger -> os membros públicos da classe base serão protegidos
  • private -> os membros públicos da classe base serão privados

Como pontos iluminados, a herança pública é uma herança tradicional que você verá na maioria das linguagens de programação. Isso é o modelo de uma relação "IS-A". Herança privada, algo AFAIK peculiar ao C++, é uma relação "IMPLEMENTADA EM TERMOS DE". Isto é, você quer utilizar a interface pública na classe derivada, mas não quer que o usuário da classe derivada tenha acesso a essa interface. Muitos argumentam que neste caso você deve agregar a classe base, ou seja, em vez de ter a classe base como uma base privada, fazer em um membro da derivada a fim de reutilizar a funcionalidade da classe base.

Comentários (2)

É essencialmente a proteção de acesso do público e dos membros protegidos da classe base na classe derivada. Com a herança pública, a classe derivada pode ver o público e os membros protegidos da base. Com a herança privada, não pode. Com a classe protegida, a classe derivada e quaisquer classes derivadas podem vê-los.

Comentários (0)