Polymorphismus und Slicing in C
Beim Umgang mit Vererbung können C-Programmierer auf das Problem des Slicings stoßen. Betrachten Sie den folgenden Code:
#include <iostream> using namespace std; class Animal { public: virtual void makeSound() { cout << "rawr" << endl; } }; class Dog : public Animal { public: virtual void makeSound() { cout << "bark" << endl; } }; int main() { Animal animal; animal.makeSound(); Dog dog; dog.makeSound(); Animal badDog = Dog(); badDog.makeSound(); Animal* goodDog = new Dog(); goodDog->makeSound(); }
Dieser Code erzeugt die folgende Ausgabe:
rawr bark rawr bark
Dies kann überraschend sein, da man erwarten könnte, dass die Ausgabe stattdessen „rawr bark bark bark“ lautet . Der Unterschied liegt in der Verwendung von Slicing in der badDog-Zuweisung:
Animal badDog = Dog();
In diesem Fall werden die Daten des Hundes in das Animal-Objekt zerlegt, was zu einem Verlust hundespezifischer Informationen führt. Dies liegt daran, dass Dog() ein Dog-Objekt erstellt, aber wenn es badDog zugewiesen wird, das ein Animal-Objekt ist, wird nur der Animal-Teil des Dogs kopiert.
Um Slicing zu vermeiden, kann man Zeiger oder verwenden Referenzen:
Animal* badDogPtr = new Dog(); Animal& goodDogRef = dog;
Zeiger und Referenzen verhalten sich wie erwartet und ermöglichen polymorphes Verhalten. Dies liegt daran, dass sie auf das Objekt verweisen oder eine Referenz darauf enthalten, anstatt wie im Fall der Wertesemantik eine Kopie davon zu haben.
In Sprachen wie Java und C# ist die Referenzsemantik die Standardeinstellung, während in C, Wertesemantik ist die Standardeinstellung. Für polymorphes Verhalten in C ist die explizite Verwendung von Referenzen oder Zeigern erforderlich.
Das obige ist der detaillierte Inhalt vonWie wirken sich Polymorphismus und Slicing auf das Objektverhalten in C aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!