types inheritance c
Explore todos os tipos de herança em C ++ com exemplos.
Em nosso tutorial anterior, aprendemos sobre herança em C ++. Dependendo de como a classe é derivada ou de quantas classes base uma classe herda, temos os seguintes tipos de herança:
- Herança Única
- Herança Múltipla
- Herança multinível
- Herança Hierárquica
- Herança Híbrida
=> Veja aqui para explorar a lista completa de tutoriais C ++.
O que você aprenderá:
Tipos de herança
A seguir, é fornecida uma representação pictórica dos vários tipos de herança.
Veremos cada tipo de herança com exemplos nas seções abaixo.
# 1) Herança única
Na herança única, uma classe deriva de apenas uma classe base. Isso significa que há apenas uma subclasse derivada de uma superclasse.
Herança única geralmente é declarada da seguinte forma:
class subclassname : accessspecifier superclassname { //class specific code; };
A seguir está um exemplo completo de herança única.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< Resultado:
Cachorro tem 4 pernas
Cachorro tem 1 cauda
Latidos!!!
Temos uma classe Animal como classe base da qual derivamos uma subclasse dog. A classe dog herda todos os membros da classe Animal e pode ser estendida para incluir suas próprias propriedades, conforme visto na saída.
Herança única é a forma mais simples de herança.
# 2) Herança múltipla
A herança múltipla é representada pictoricamente a seguir.

Herança múltipla é um tipo de herança em que uma classe deriva de mais de uma classe. Conforme mostrado no diagrama acima, a classe C é uma subclasse que possui a classe A e a classe B como pai.
Em um cenário da vida real, uma criança herda de seu pai e mãe. Isso pode ser considerado um exemplo de herança múltipla.
Apresentamos o programa abaixo para demonstrar a herança múltipla.
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
Resultado:
Digite o número do rolo: 25
Insira as duas notas mais altas: 40 50
Insira a nota para Atividades CoCurriculares: 30
Roll No: 25
Notas totais: 120
Notas médias: 40
No exemplo acima, temos três classes, ou seja, student_marks, cocurricular_marks e Result. A classe student_marks lê a marca de assunto para o aluno. A classe cocurricular_marks lê as notas do aluno em atividades extracurriculares.
A classe Result calcula o total_marks para o aluno junto com as notas médias.
Neste modelo, a classe Resultado é derivada de student_marks e cocurricular_marks conforme calculamos o Resultado do assunto, bem como as notas de atividades co-curriculares.
Isso exibe várias heranças.
Problema de diamante
O problema do diamante é representado pictoricamente abaixo:

instrução python if em uma linha
Aqui, temos uma classe infantil herdando duas classes pai e mãe. Essas duas classes, por sua vez, herdam a classe Person.
Conforme mostrado na figura, a classe Criança herda os traços da classe Pessoa duas vezes, ou seja, uma vez do Pai e a segunda vez da Mãe. Isso dá origem a ambigüidade, pois o compilador não consegue entender qual caminho seguir.
Uma vez que este cenário surge quando temos uma herança em forma de diamante, este problema é conhecido como ' O problema do diamante ”.
O problema Diamond implementado em C ++ resulta em erro de ambigüidade na compilação. Podemos resolver esse problema tornando a classe base raiz virtual. Aprenderemos mais sobre a palavra-chave “virtual” em nosso próximo tutorial sobre polimorfismo.
# 3) Herança multinível
A herança multinível é representada abaixo.

Na herança de vários níveis, uma classe é derivada de outra classe derivada. Essa herança pode ter tantos níveis, desde que nossa implementação não seja inconstante. No diagrama acima, a classe C é derivada da Classe B. A Classe B, por sua vez, é derivada da classe A.
Vejamos um exemplo de herança multinível.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< Resultado:
O cachorro tem 4 pernas
O cachorro tem 1 cauda
Cachorro Barks !!! Cachorro Chora !!
Aqui, modificamos o exemplo para Herança única de forma que haja uma nova classe Puppy que herda da classe Dog que, por sua vez, herda da classe Animal. Vemos que a classe Puppy adquire e usa as propriedades e métodos de ambas as classes acima dela.
# 4) Herança híbrida
A herança híbrida é descrita abaixo.

A herança híbrida é geralmente uma combinação de mais de um tipo de herança. Na representação acima, temos herança múltipla (B, C e D) e herança multinível (A, B e D) para obter uma herança híbrida.
Vejamos um exemplo de herança híbrida.
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
Resultado:
Insira a ID do aluno e o nome do aluno 25 Ved
Digite 3 marcas de assunto: 89 88 87
Insira as marcas esportivas: 40
Total de notas = 264
Notas médias = 88
Média + notas esportivas = 128
Aqui temos quatro classes, ou seja, Aluno, Marcas, Esportes e Resultado. As notas são derivadas da classe do aluno. A classe Resultado deriva de Marcas e Esportes, pois calculamos o resultado das marcas de assunto, bem como das marcas de esportes.
A saída é gerada criando um objeto da classe Result que adquiriu as propriedades de todas as três classes.
Observe que na herança híbrida também, a implementação pode resultar em “Problema do diamante” que pode ser resolvido usando a palavra-chave “virtual” conforme mencionado anteriormente.
# 5) Herança hierárquica

Na herança hierárquica, mais de uma classe herda de uma única classe base, conforme mostrado na representação acima. Isso dá a ele uma estrutura de hierarquia.
A seguir está o exemplo que demonstra a herança hierárquica.
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< Resultado:
Insira o comprimento e a largura de um retângulo: 10 5
Área do retângulo = 50
Insira a base e a altura do triângulo: 4 8
Área do triângulo = 16
Insira o comprimento de um lado do quadrado: 5
Área do quadrado = 20
O exemplo acima é um exemplo clássico da classe Shape. Temos uma classe base Forma e três classes, ou seja, retângulo, triângulo e quadrado, são derivados dela.
Temos um método para ler dados na classe Shape enquanto cada classe derivada tem seu próprio método para calcular a área. Na função principal, lemos os dados de cada objeto e calculamos a área.
Conclusão
Quando comparada a outras linguagens de programação, a linguagem C ++ oferece suporte a todos os tipos de herança. Na verdade, podemos dizer que C ++ tem um suporte muito bom para herança. Podemos modelar problemas em tempo real com mais eficiência usando C ++.
Neste tutorial, vimos todos os tipos de herança suportados pelo C ++.
Leia também = >> Tipos de herança em Java
Em nosso próximo tutorial, aprenderemos mais sobre o recurso de polimorfismo da OOP.
=> Verifique a série de treinamento C ++ GRÁTIS completa aqui.
Leitura recomendada
- Herança em C ++
- Tipos de dados C ++
- Tipos de riscos em projetos de software
- Tipos de dados Python
- Best FREE C # Tutorial Series: The Ultimate C # Guide for Beginners
- Tipos de Loop Unix Shell: Do While Loop, For Loop, Até Loop no Unix
- Diferentes tipos de correspondências fornecidas por Mockito
- 7 tipos de erros de software que todo testador deve saber