Objekt-Slicing in C++

Jinku Hu 12 Oktober 2023
Objekt-Slicing in C++

In diesem Artikel wird das Objekt-Slicing in C++ vorgestellt.

Verwenden von Object Slicing zum abgeleiteten Klassenobjekt in die Basisklasse in C++

Das Kernkonzept der objektorientierten Programmierung ist die Vererbung, was bedeutet, dass Klassen miteinander in Beziehung gesetzt werden und eine Hierarchie bilden können. Die Wurzel der Hierarchie wird im Allgemeinen als Basisklasse bezeichnet, von der andere Klassen Merkmale in Form von Datenelementen oder Funktionen erben. Die Klassen, die von anderen Klassen erben, werden abgeleitete Klassen genannt. Es gibt verschiedene Arten der Vererbung, die die Zugriffssteuerung für die Basisklassenmember angeben und auf welche von ihnen in der abgeleiteten Klasse zugegriffen werden kann. Auf private Member der Basisklasse kann beispielsweise nicht direkt von der abgeleiteten Klasse aus zugegriffen werden. Stattdessen sollte eine abgeleitete Klasse öffentliche Methoden verwenden, um diese Member abzurufen. Die Basisklasse kann einen separaten Satz von Mitgliedern mit einem geschützten Bezeichner bezeichnen, auf den direkt von den abgeleiteten Klassen zugegriffen werden kann.

In diesem Fall konzentrieren wir uns auf abgeleitete-zu-Basis-Konvertierungsregeln und die Anwendungsfälle für solche Funktionen. Normalerweise enthalten abgeleitete Klassen nichtstatische Member, die in der abgeleiteten Klasse selbst definiert sind, und alle Member, die von den anderen Klassen geerbt werden. Wenn ein abgeleitetes Objekt einem Basisklassenobjekt zugewiesen wird, wird ein Zuweisungsoperatorlauf von der Basisklasse übernommen. Somit kennt dieser Operator nur die Basisklassenmember, und nur diese Member werden während des Zuweisungsvorgangs kopiert.

#include <iostream>

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

class Person {
 protected:
  string name;

 public:
  explicit Person(string s) : name(std::move(s)) {}

  string getName() { return name; };
};

class Athlete : public Person {
  string sport;

 public:
  explicit Athlete(string s) : Person(std::move(s)){};
  Athlete(string s, string sp) : Person(std::move(s)), sport(std::move(sp)){};

  string getSport() { return sport; }
};

class Politician : public Person {
  string party;

 public:
  explicit Politician(string s) : Person(std::move(s)) {}
  Politician(string s, string p) : Person(std::move(s)), party(std::move(p)) {}

  string getParty() { return party; }
};

int main() {
  Politician p1("Lua", "D");
  Athlete a1("Lebron", "LA Lakers");

  cout << p1.getName() << " " << p1.getParty() << endl;

  Person p0 = p1;
  Athlete a2(p0.getName());

  cout << p0.getName() << endl;
  cout << a2.getName() << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

Lua D
Lua

Der vorherige Beispielcode definiert zwei Klassen, Politician und Athlete, abgeleitet von der Klasse Person. Wir können also das Objekt Politician der Person zuordnen, aber nicht anders herum. Wenn die Zuweisung erfolgt ist, ist die Member-Funktion getParty im neu erstellten p0-Objekt nicht zugänglich. Folglich führt die folgende Version des Codes zu einem Kompilierungsfehler, da p0 ein Mitglied der Klasse Politician aufruft.

#include <iostream>

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

class Person {
 protected:
  string name;

 public:
  explicit Person(string s) : name(std::move(s)) {}

  string getName() { return name; };
};

class Athlete : public Person {
  string sport;

 public:
  explicit Athlete(string s) : Person(std::move(s)){};
  Athlete(string s, string sp) : Person(std::move(s)), sport(std::move(sp)){};

  string getSport() { return sport; }
};

class Politician : public Person {
  string party;

 public:
  explicit Politician(string s) : Person(std::move(s)) {}
  Politician(string s, string p) : Person(std::move(s)), party(std::move(p)) {}

  string getParty() { return party; }
};

int main() {
  Politician p1("Lua", "D");
  Athlete a1("Lebron", "LA Lakers");

  cout << p1.getName() << " " << p1.getParty() << endl;

  Person p0 = p1;
  Politician p2 = p0;
  Politician p2 = a1;

  cout << p0.getName() << " " << p0.getParty() << endl;

  return EXIT_SUCCESS;
}
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