Polymorphismus und Slicing in C
In C können Sie mit Polymorphismus Objekte mit unterschiedlicher Funktionalität basierend auf ihrer abgeleiteten Klasse erstellen. Allerdings kann es bei unsachgemäßer Handhabung zu seltsamem Verhalten kommen. Ein solches Problem ist das „Slicing“.
Bedenken 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(); }
Die Ausgabe, die Sie erhalten, ist:
rawr bark rawr bark
Sie können erwarten, dass die Ausgabe so ist „rawr bark bark bark“, aber stattdessen verhält sich das Objekt badDog wie ein Tier und nicht wie ein Hund. Dies liegt am Slicing.
Wenn Sie badDog als Animal badDog = Dog() erstellen, schneiden Sie das Dog-Objekt in ein Animal. Das bedeutet, dass badDog nur die Teile von Dog enthält, die Teil der Animal-Klasse sind, und die gesamte spezifische Dog-Funktionalität verloren geht.
Um dies zu beheben, müssen Sie Zeiger oder Referenzen verwenden, um Klassen abzuleiten. Zeiger oder Referenzen kopieren das Objekt nicht, sodass sie ihre spezifische Funktionalität beibehalten können. Beispielsweise behält der goodDog-Zeiger seine Dog-Funktionalität erfolgreich bei.
Einige Sprachen wie Java verfügen standardmäßig über Referenzsemantik, während C Wertesemantik verwendet. In C müssen Sie explizit Zeiger oder Referenzen verwenden, um eine Referenzsemantik zu erreichen. Andernfalls kann es zu Slicing-Problemen kommen, wie im badDog-Beispiel gezeigt.
Das obige ist der detaillierte Inhalt vonWie wirkt sich Slicing auf den Polymorphismus in C aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!