Herança C ++

Neste tutorial, aprenderemos sobre herança em C ++ com a ajuda de exemplos.

Herança é um dos principais recursos da programação orientada a objetos em C ++. Ele nos permite criar uma nova classe (classe derivada) a partir de uma classe existente (classe base).

A classe derivada herda os recursos da classe base e pode ter recursos adicionais próprios. Por exemplo,

 class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );

Aqui, a Dogclasse é derivada da Animalclasse. Como Dogé derivado de Animal, os membros de Animalsão acessíveis a Dog.

Herança em C ++

Observe o uso da palavra-chave publicao herdar Cachorro de Animal.

 class Dog : public Animal (… );

Também podemos usar as palavras-chave privatee em protectedvez de public. Vamos aprender sobre as diferenças entre o uso private, publice protectedmais tarde neste tutorial.

é um relacionamento

A herança é um relacionamento é . Usamos herança apenas se um relacionamento é um entre as duas classes.

aqui estão alguns exemplos:

  • Um carro é um veículo.
  • A laranja é uma fruta.
  • Um cirurgião é um médico.
  • Um cachorro é um animal.

Exemplo 1: exemplo simples de herança C ++

 // C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )

Resultado

Eu posso comer! Eu posso dormir! Eu posso latir! Woof woof !!

Aqui, dog1 (o objeto da classe derivada Dog) pode acessar membros da classe base Animal. É porque Dogé herdado de Animal.

 // Calling members of the Animal class dog1.eat(); dog1.sleep();

Membros protegidos C ++

O modificador de acesso protectedé especialmente relevante quando se trata de herança C ++.

Como os privatemembros, os protectedmembros estão inacessíveis fora da classe. No entanto, eles podem ser acessados ​​por classes derivadas e classes / funções amigas .

Precisamos de protectedmembros se quisermos ocultar os dados de uma classe, mas ainda quisermos que os dados sejam herdados por suas classes derivadas.

Para saber mais sobre proteção, consulte nosso tutorial sobre modificadores de acesso C ++.

Exemplo 2: Membros protegidos C ++

 // C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )

Resultado

Eu posso comer! Eu posso dormir! Eu posso latir! Woof woof !! Eu sou um mamífero minha cor é preta

Aqui, o tipo de variável é protectede, portanto, acessível a partir da classe derivada Dog. Podemos ver isso porque inicializamos typea Dogclasse usando a função setType().

Por outro lado, a privatevariável color não pode ser inicializada em Dog.

 class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );

Além disso, como a protectedpalavra - chave oculta dados, não podemos acessar o tipo diretamente de um objeto Dogou Animalclasse.

 // Error: member "Animal::type" is inaccessible dog1.type = "mammal";

Modos de acesso na herança de C ++

Em nossos tutoriais anteriores, aprendemos sobre especificadores de acesso C ++, como public, private e protected.

Até agora, usamos a publicpalavra - chave para herdar uma classe de uma classe base existente. No entanto, também podemos usar as palavras-chave privatee protectedpara herdar classes. Por exemplo,

 class Animal ( // code ); class Dog : private Animal ( // code );
 class Cat : protected Animal ( // code );

As várias maneiras pelas quais podemos derivar classes são conhecidas como modos de acesso . Esses modos de acesso têm o seguinte efeito:

  1. public: Se uma classe derivada é declarada no publicmodo, os membros da classe base são herdados pela classe derivada da mesma forma que são.
  2. private: neste caso, todos os membros da classe base tornam-se privatemembros da classe derivada.
  3. protegido: Os publicmembros da classe base tornam-se protectedmembros da classe derivada.

Os privatemembros da classe base estão sempre privatena classe derivada.

Para saber mais, visite nosso tutorial C ++ de herança pública, privada e protegida.

Substituição de função de membro na herança

Suponha que a classe base e a classe derivada tenham funções de membro com o mesmo nome e argumentos.

Se criarmos um objeto da classe derivada e tentarmos acessar essa função de membro, a função de membro da classe derivada será chamada em vez da da classe base.

A função de membro da classe derivada substitui a função de membro da classe base.

Saiba mais sobre substituição de funções em C ++.

Leitura recomendada: herança múltipla em C ++

Artigos interessantes...