Herencia múltiple en C++
- Usar herencia múltiple para aplicar múltiples propiedades de las dos clases dadas a otra
-
Utilice la palabra clave
virtual
para corregir varias copias de clases base
Este artículo mostrará varios métodos sobre cómo utilizar varias herencias en C++.
Usar herencia múltiple para aplicar múltiples propiedades de las dos clases dadas a otra
Las clases en C++ pueden tener múltiples herencias, lo que brinda la posibilidad de derivar una clase de más de una clase base directa.
Esto implica que puede haber un comportamiento inusual particular cuando las clases no se implementan con cuidado. Por ejemplo, considere el siguiente fragmento de código, donde la clase C
se deriva de la clase B
y A
. Todos ellos tienen el constructor predeterminado que genera la cadena especial. Aunque, cuando declaramos un objeto de tipo C
en la función mainc
, tres constructores imprimen la salida. Observe que se llama a los constructores en el mismo orden en que se heredaron. Por otro lado, los destructores se llaman en orden inverso.
#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;
}
Producción :
Bs constructor called
As constructor called
Cs constructor called
Utilice la palabra clave virtual
para corregir varias copias de clases base
Tenga en cuenta que el siguiente programa genera las dos instancias del constructor de la clase Planet
, los constructores Mars
y Earth
cada uno, y finalmente el constructor de la clase Rock
. Además, el destructor de la clase Planet
será llamado dos veces cuando el objeto salga del alcance. Sin embargo, tenga en cuenta que este problema se puede resolver agregando la palabra clave virtual
a las clases Marte
y Tierra
. Cuando una clase tiene varias clases base, existe la posibilidad de que la clase derivada herede un miembro con el mismo nombre de dos o más de sus clases base.
#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); }
Producción :
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