Herança múltipla em C++
- Use a herança múltipla para aplicar várias propriedades das duas classes dadas a outra
-
Use a palavra-chave
virtual
para corrigir várias cópias de classes base
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
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