Ereditarietà multipla in C++

Jinku Hu 12 ottobre 2023
  1. Usa ereditarietà multipla per applicare più proprietà delle due classi date a un’altra
  2. Usa la parola chiave virtuale per correggere più copie di classi di base
Ereditarietà multipla in C++

Questo articolo illustrerà più metodi su come utilizzare più eredità in C++.

Usa ereditarietà multipla per applicare più proprietà delle due classi date a un’altra

Le classi in C++ possono avere più eredità, il che offre la possibilità di derivare una classe da più di una classe base diretta.

Ciò implica che potrebbe esserci un comportamento insolito particolare quando le classi non vengono implementate con attenzione. Ad esempio, considera il seguente frammento di codice, dove la classe C è derivata dalla classe B e A. Tutti hanno il costruttore predefinito che restituisce la stringa speciale. Sebbene, quando dichiariamo un oggetto di tipo C nella funzione mainc, tre costruttori stampano l’output. Si noti che i costruttori vengono chiamati nello stesso ordine in cui sono stati ereditati. D’altra parte, i distruttori vengono chiamati in ordine 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;
}

Produzione:

Bs constructor called
As constructor called
Cs constructor called

Usa la parola chiave virtuale per correggere più copie di classi di base

Notare che il seguente programma restituisce le due istanze del costruttore della classe Planet, i costruttori Mars e Earth ciascuno, e infine il costruttore della classe Rock. Inoltre, il distruttore della classe Planet verrà chiamato due volte quando l’oggetto esce dall’ambito. Attenzione però, questo problema può essere risolto aggiungendo la parola chiave virtual alle classi Mars e Earth. Quando una classe ha più classi di base, esiste la possibilità che la classe derivata erediti un membro con lo stesso nome da due o più delle sue classi di 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); }

Produzione:

Planet::Planet(int ) called
Mars::Mars(int ) called
Planet::Planet(int ) called
Earth::Earth(int ) called
Rock::Rock(int ) called
Autore: 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

Articolo correlato - C++ Class