Mehrfachvererbung in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden von Mehrfachvererbung, um mehrere Eigenschaften der zwei gegebenen Klassen auf eine andere anzuwenden
  2. Verwendung des virtual-Schlüsselworts zur Fixierung von Mehrfachkopien von Basisklassen
Mehrfachvererbung in C++

Dieser Artikel zeigt verschiedene Methoden zur Verwendung mehrerer Vererbungen in C++.

Verwenden von Mehrfachvererbung, um mehrere Eigenschaften der zwei gegebenen Klassen auf eine andere anzuwenden

Klassen in C++ können mehrere Vererbungen haben, wodurch die Möglichkeit besteht, eine Klasse von mehr als einer direkten Basisklasse abzuleiten.
Dies impliziert, dass es zu einem besonders ungewöhnlichen Verhalten kommen kann, wenn die Klassen nicht sorgfältig implementiert werden. Betrachten Sie beispielsweise den folgenden Snippet-Code, bei dem die Klasse C von den Klassen B und A abgeleitet ist. Alle haben den Standardkonstruktor, der die spezielle Zeichenkette ausgibt. Wenn wir jedoch ein Objekt vom Typ C in der Funktion mainc deklarieren, drucken drei Konstruktoren die Ausgabe. Beachten Sie, dass Konstruktoren in derselben Reihenfolge aufgerufen werden, in der sie geerbt wurden. Andererseits werden die Destruktoren in umgekehrter Reihenfolge aufgerufen.

#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;
}

Ausgabe:

Bs constructor called
As constructor called
Cs constructor called

Verwendung des virtual-Schlüsselworts zur Fixierung von Mehrfachkopien von Basisklassen

Beachten Sie, dass das folgende Programm die beiden Instanzen des Klassenkonstruktors Planet, jeweils die Konstruktoren Mars und Erde und schließlich den Klassenkonstruktor Rock ausgibt. Außerdem wird der Destruktor der Klasse Planet zweimal aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt. Beachten Sie jedoch, dass dieses Problem gelöst werden kann, indem Sie den Klassen Mars und Earth das Schlüsselwort virtual hinzufügen. Wenn eine Klasse mehrere Basisklassen hat, besteht die Möglichkeit, dass die abgeleitete Klasse ein Mitglied mit demselben Namen von zwei oder mehr ihrer Basisklassen erbt.

#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); }

Ausgabe:

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

Verwandter Artikel - C++ Class