Herança em C++

Herança em C++

A herança é um conceito fundamental na OOP (Programação Orientada a Objetos) . É o mecanismo pelo qual uma classe pode herdar os recursos (campos e métodos) de outra classe. Herança significa criar novas classes com base nas existentes. Uma classe que herda de outra classe pode reutilizar os métodos e campos dessa classe.

Exemplo: No exemplo a seguir Animal é a classe base e Dog Cat e Cow são classes derivadas que estendem a classe Animal.

classe_animalInheritance C++
   #include          using     namespace     std  ;   class     Animal   {      public  :      void     sound  ()      {      cout      < <     'Animal makes a sound'      < <     endl  ;      }   };   class     Dog     :     public     Animal   {      public  :      void     sound  ()      {      cout      < <     'Dog barks'      < <     endl  ;      }   };   class     Cat     :     public     Animal   {      public  :      void     sound  ()      {      cout      < <     'Cat meows'      < <     endl  ;      }   };   class     Cow     :     public     Animal   {      public  :      void     sound  ()      {      cout      < <     'Cow moos'      < <     endl  ;      }   };   int     main  ()   {      Dog     d  ;      d  .  sound  ();      Cat     c  ;      c  .  sound  ();      Cow     cow  ;      cow  .  sound  ();      return     0  ;   }   

Saída
Dog barks Cat meows Cow moos  

Explicação:

  • Animal é a classe base com uma função sound().
  • Dog Cat e Cow são classes derivadas, cada uma definindo seu próprio método sound().
  • Em main() os objetos Dog Cat e Cow são criados separadamente.
  • Quando chamamos sound() em cada objeto, o respectivo método da classe filha é executado (Cachorro late, Gato mia Vaca muge).

Sintaxe

C++
   class     ChildClass     :     public     ParentClass   {      // Additional fields and methods   };   

Como funciona a herança em C++?

Os dois pontos (:) com um especificador de acesso é usado para herança em C++. Ele permite que a classe derivada (classe filha) herde os membros de dados (campos) e funções de membro (métodos) da classe base (classe pai).
Quando uma classe herda outra classe, ela obtém todos os membros acessíveis da classe pai e a classe filha também pode redefinir (substituir) ou adicionar novas funcionalidades a eles.

Tipos de herança em C++

herança

Abaixo estão os diferentes tipos de herança suportados por C++.

1. Herança única

Na herança única, uma subclasse é derivada de apenas uma superclasse. Ele herda as propriedades e o comportamento de uma classe monoparental. Às vezes também é conhecido como herança simples.

herançaSingle Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle     {   public  :      Vehicle  ()     {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   class     Car     :     public     Vehicle     {   public  :      Car  ()     {      cout      < <     'This Vehicle is Car'      < <     endl  ;      }   };   int     main  ()     {          Car     obj  ;      return     0  ;   }   

Saída
This is a Vehicle This Vehicle is Car  

2. Herança Múltipla

Em Herança múltipla uma classe pode ter mais de uma superclasse e herdar recursos de todas as classes pai.

Herança_múltiplaMultiple Inheritance C++
   #include          using     namespace     std  ;   class     LandVehicle   {      public  :      void     landInfo  ()      {      cout      < <     'This is a LandVehicle'      < <     endl  ;      }   };   class     WaterVehicle   {      public  :      void     waterInfo  ()      {      cout      < <     'This is a WaterVehicle'      < <     endl  ;      }   };   // Derived class inheriting from both base classes   class     AmphibiousVehicle     :     public     LandVehicle       public     WaterVehicle   {      public  :      AmphibiousVehicle  ()      {      cout      < <     'This is an AmphibiousVehicle'      < <     endl  ;      }   };   int     main  ()   {      AmphibiousVehicle     obj  ;      obj  .  waterInfo  ();      obj  .  landInfo  ();      return     0  ;   }   

Saída
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle  

3. Herança multinível

Herança multinível em C++ significa que uma classe é derivada de outra classe derivada formando uma cadeia de herança.

Herança_multinívelMultilevel Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle   {      public  :      Vehicle  ()      {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   // Derived class from Vehicle   class     FourWheeler     :     public     Vehicle   {      public  :      FourWheeler  ()      {      cout      < <     '4 Wheeler Vehicles'      < <     endl  ;      }   };   // Derived class from FourWheeler   class     Car     :     public     FourWheeler   {      public  :      Car  ()      {      cout      < <     'This 4 Wheeler Vehicle is a Car'      < <     endl  ;      }   };   int     main  ()   {      Car     obj  ;      return     0  ;   }   

Saída
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car  

4. Herança Hierárquica

Na herança hierárquica, mais de uma subclasse é herdada de uma única classe base. ou seja, mais de uma classe derivada é criada a partir de uma única classe base. Por exemplo, carros e ônibus são veículos.

herança_hierárquicaHierarchical Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle   {      public  :      Vehicle  ()      {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   class     Car     :     public     Vehicle   {      public  :      Car  ()      {      cout      < <     'This Vehicle is Car'      < <     endl  ;      }   };   class     Bus     :     public     Vehicle   {      public  :      Bus  ()      {      cout      < <     'This Vehicle is Bus'      < <     endl  ;      }   };   int     main  ()   {      Car     obj1  ;      Bus     obj2  ;      return     0  ;   }   

Saída
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus  

5. Herança Híbrida

Quando dois ou mais tipos de herança são combinados em um programa. Por exemplo, uma classe pode usar herança múltipla e também fazer parte de uma cadeia de herança multinível.

herança híbridaHybrid Inheritance C++
   #include          using     namespace     std  ;   class     Vehicle   {      public  :      Vehicle  ()      {      cout      < <     'This is a Vehicle'      < <     endl  ;      }   };   class     Fare   {      public  :      Fare  ()      {      cout      < <     'Fare of Vehicle'      < <     endl  ;      }   };   class     Car     :     public     Vehicle   {      public  :      Car  ()      {      cout      < <     'This Vehical is a Car'      < <     endl  ;      }   };   class     Bus     :     public     Vehicle       public     Fare   {      public  :      Bus  ()      {      cout      < <     'This Vehicle is a Bus with Fare'  ;      }   };   int     main  ()   {      Bus     obj2  ;      return     0  ;   }   

Saída
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare 

A herança híbrida pode levar à problema do diamante em C++. Isso acontece quando uma classe herda de duas classes que compartilham a mesma classe base. Como resultado, a classe derivada obtém múltiplas cópias dos membros da classe base, o que cria ambiguidade sobre qual delas usar.

Observação : A solução é usar herança virtual para que apenas uma cópia da classe base seja compartilhada.

Vantagens da herança em C++

  • Reutilização de código : A classe derivada pode reutilizar diretamente membros de dados e métodos de sua classe base, evitando duplicação de código.
  • Abstração: Suporta classes abstratas (classes com funções virtuais puras) que definem uma interface comum que impõe abstração.
  • Hierarquia de classes: Você pode construir hierarquias (base → derivada → derivada adicional) para modelar relacionamentos do mundo real.
  • Polimorfismo: Suporta totalmente o polimorfismo de tempo de execução por meio de funções virtuais e também o polimorfismo de tempo de compilação por meio de sobrecarga de funções e modelos.

Desvantagens da herança em C++

  • Acoplamento apertado: A classe filha torna-se dependente da classe pai. Qualquer alteração na classe base pode forçar alterações nas classes derivadas.
  • Flexibilidade reduzida: Às vezes, a herança é mal utilizada onde a composição (tem um relacionamento) seria melhor, levando a um código menos flexível.
  • Maior complexidade: Hierarquias de herança profundas (multinível ou híbridas) podem tornar o código difícil de entender, manter e depurar.
  • Problema do diamante: Com herança híbrida ou múltipla, pode ocorrer ambiguidade se a mesma classe base for herdada várias vezes.
  • Sobrecarga de funções virtuais: Se o polimorfismo (funções virtuais) for usado, haverá uma pequena sobrecarga de tempo de execução devido às pesquisas em tabelas virtuais.
Criar questionário