Herança múltipla em C++

Jinku Hu 12 outubro 2023
  1. Use a herança múltipla para aplicar várias propriedades das duas classes dadas a outra
  2. Use a palavra-chave virtual para corrigir várias cópias de classes base
Herança múltipla em C++

Este artigo demonstrará vários métodos sobre como usar várias heranças em C++.

Use a herança múltipla para aplicar várias propriedades das duas classes dadas a outra

As classes em C++ podem ter várias heranças, o que fornece a possibilidade de derivar uma classe de mais de uma classe base direta.

Isso implica que pode haver um comportamento incomum específico quando as classes não são implementadas com cuidado. Por exemplo, considere o seguinte código de fragmento, onde a classe C é derivada da classe B e A. Todos eles têm o construtor padrão que produz a string especial. Embora, quando declaramos um objeto do tipo C na função mainc, três construtores imprimem a saída. Observe que os construtores são chamados na mesma ordem em que foram herdados. Por outro lado, os destruidores são chamados em ordem reversa.

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A {
 public:
  A() { cout << "A's constructor called" << endl; }
};

class B {
 public:
  B() { cout << "B's constructor called" << endl; }
};

class C : public B, public A {
 public:
  C() { cout << "C's constructor called" << endl; }
};

int main() {
  C c;
  return 0;
}

Resultado:

Bs constructor called
As constructor called
Cs constructor called

Use a palavra-chave virtual para corrigir várias cópias de classes base

Observe que o programa a seguir gera as duas instâncias do construtor da classe Planeta, cada um dos construtores Mars e Earth e, finalmente, o construtor da classe Rock. Além disso, o destruidor da classe Planet será chamado duas vezes quando o objeto sair do escopo. Lembre-se, porém, de que este problema pode ser resolvido adicionando a palavra-chave virtual às classes Mars e Earth. Quando uma classe possui várias classes básicas, existe a possibilidade de que a classe derivada herde um membro com o mesmo nome de duas ou mais de suas classes básicas.

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class Planet {
 public:
  Planet(int x) { cout << "Planet::Planet(int ) called" << endl; }
};

class Mars : public Planet {
 public:
  Mars(int x) : Planet(x) { cout << "Mars::Mars(int ) called" << endl; }
};

class Earth : public Planet {
 public:
  Earth(int x) : Planet(x) { cout << "Earth::Earth(int ) called" << endl; }
};

class Rock : public Mars, public Earth {
 public:
  Rock(int x) : Earth(x), Mars(x) { cout << "Rock::Rock(int ) called" << endl; }
};

int main() { Rock tmp(30); }

Resultado:

Planet::Planet(int ) called
Mars::Mars(int ) called
Planet::Planet(int ) called
Earth::Earth(int ) called
Rock::Rock(int ) called
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - C++ Class