Modelos de Herança em C++: Múltipla, Multinível e Hierárquica
Modelos de Herança em C++: Múltipla, Multinível e Hierárquica
Neste tutorial, exploramos padrões de herança em C++ — múltipla, multinível e hierárquica — com exemplos práticos de código.
Herança é uma característica fundamental da programação orientada a objetos. Ela permite que desenvolvedores criem novas classes que herdam propriedades e comportamento de existentes.
Abaixo examinamos três modelos-chave de herança disponíveis em C++.
Herança Multinível em C++
Em uma hierarquia multinível, uma classe deriva de outra classe derivada. A cadeia continua até que uma classe base seja alcançada.
class A { // Implementação da classe base }; class B : public A { // B herda de A }; class C : public B { // C herda de B };
Aqui, B herda de A, e C herda de B, formando uma cadeia de herança vertical.
Exemplo 1: Herança Multinível em C++
#include <iostream> using namespace std; class A { public: void display() { cout << "Conteúdo da classe base." << endl; } }; class B : public A {}; class C : public B {}; int main() { C obj; obj.display(); return 0; }
Saída
Conteúdo da classe base.
Este programa demonstra que um objeto de C pode invocar display() definido na classe base final A porque não existe implementação de sobrescrita em B ou C. O compilador resolve a chamada pesquisando a cadeia de herança da classe mais derivada para cima.
Herança Múltipla em C++
C++ permite que uma classe herde de mais de uma classe base. Por exemplo, um Morcego pode derivar de ambos Mamifero e AnimalAlado porque um morcego é simultaneamente um mamífero e uma criatura alada.
Exemplo 2: Herança Múltipla em C++
#include <iostream> using namespace std; class Mamifero { public: Mamifero() { cout << "Mamíferos podem dar à luz diretamente." << endl; } }; class AnimalAlado { public: AnimalAlado() { cout << "Animais alados podem bater asas." << endl; } }; class Morcego : public Mamifero, public AnimalAlado {}; int main() { Morcego b1; return 0; }
Saída
Mamíferos podem dar à luz diretamente. Animais alados podem bater asas.
Resolvendo Ambiguidade na Herança Múltipla
Quando duas classes base fornecem uma função com o mesmo nome, o compilador não consegue decidir qual invocar, levando a um erro de ambiguidade.
class Base1 { public: void someFunction() { /* ... */ } }; class Base2 { public: void someFunction() { /* ... */ } }; class Derived : public Base1, public Base2 {}; int main() { Derived obj; // obj.someFunction(); // Erro: ambíguo }
Use o operador de resolução de escopo para especificar a função da classe base desejada:
int main() { Derived obj; obj.Base1::someFunction(); // Chama implementação de Base1 obj.Base2::someFunction(); // Chama implementação de Base2 }
Herança Hierárquica em C++
Na herança hierárquica, várias classes derivadas herdam de uma única classe base. Todos os atributos e comportamentos comuns são encapsulados na classe base, enquanto cada classe derivada pode adicionar sua própria especialização.
Exemplos incluem Fisica, Quimica e Biologia derivando de Ciencia; e Cachorro, Gato, Cavalo derivando de Animal.
Sintaxe da Herança Hierárquica
class BaseClass { // Conteúdo da classe base }; class DerivedOne : public BaseClass { // Membros adicionais }; class DerivedTwo : public BaseClass { // Membros adicionais }; class DerivedThree : public BaseClass { // Membros adicionais };
Exemplo 3: Herança Hierárquica em C++
// Programa C++ demonstrando herança hierárquica #include <iostream> using namespace std; // Classe base class Animal { public: void info() { cout << "Eu sou um animal." << endl; } }; // Classe derivada 1 class Dog : public Animal { public: void bark() { cout << "Eu sou um Cachorro. Au au." << endl; } }; // Classe derivada 2 class Cat : public Animal { public: void meow() { cout << "Eu sou um Gato. Miau." << endl; } }; int main() { // Instância Dog Dog dog1; cout << "Classe Dog:" << endl; dog1.info(); dog1.bark(); // Instância Cat Cat cat1; cout << "\nClasse Cat:" << endl; cat1.info(); cat1.meow(); return 0; }
Saída
Classe Dog: Eu sou um animal. Eu sou um Cachorro. Au au. Classe Cat: Eu sou um animal. Eu sou um Gato. Miau.
Tanto Dog quanto Cat herdam o método info() de Animal, enquanto cada classe introduz seu próprio comportamento especializado.
Linguagem C
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Dominando Classes e Métodos Abstratos em C#: Guia Prático
- Entendendo Classes e Métodos Parciais em C#
- Dominando Classes e Métodos Sealed em C#: Quando Usar, Exemplos Claros e Segurança de Código
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Dominando Herança em C++: Public, Protected & Private Explicados
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- C++ Struct vs Class: Diferenças Principais, Sintaxe e Melhores Casos de Uso
- Entendendo Classes de Armazenamento em C++: Escopo, Tempo de Vida e Uso
- Guia Completo de Data e Hora em C++