Heim >Backend-Entwicklung >C++ >Warum kommt es beim C-Polymorphismus zum Slicing und wie kann es vermieden werden?
Polymorphismus und Slicing in C: Die Verwirrung entschlüsseln
In C ermöglicht Polymorphismus, dass von einer Basisklasse abgeleitete Objekte unterschiedliche Verhaltensweisen aufweisen. Eine häufige Gefahr, die als „Slicing“ bekannt ist, kann jedoch zu unerwarteten Ergebnissen führen.
Frage:
Bedenken Sie den folgenden Codeausschnitt:
class Animal { virtual void makeSound() { cout << "rawr" << endl; } }; class Dog : public Animal { 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 lautet:
rawr bark rawr bark
Warum wird die Ausgabe für badDog nicht gedruckt? „bellen“?
Antwort:
Dies ist ein Beispiel für das Schneiden. Wenn Sie ein Dog-Objekt an den Animal-Konstruktor übergeben (wie in badDog = Dog()), wird der Animal-Teil des Dogs in badDog kopiert. Da badDog jedoch vom Typ Animal ist, kann es nur auf die Animal-Methoden zugreifen, die standardmäßig „rawr“ ausgeben.
Um Polymorphismus zu erreichen, müssen Sie Zeiger oder Referenzen verwenden, um auf das abgeleitete Klassenobjekt zu verweisen. In diesem Fall ist goodDog ein Zeiger auf ein Dog-Objekt, sodass es auf die Dog-Methoden zugreifen und „bark“ ausgeben kann.
Auswirkungen:
Slicing kann dazu führen kann zu unerwarteten Verhaltensweisen führen und wird im Allgemeinen nicht empfohlen. Die Verwendung von Zeigern oder Referenzen gewährleistet ein ordnungsgemäßes polymorphes Verhalten.
Denken Sie außerdem daran, dass C standardmäßig Wertesemantik verwendet, was bedeutet, dass Variablen die tatsächlichen Objekte enthalten. Dies unterscheidet sich von der Referenzsemantik in Sprachen wie Java und C#, wo Variablen Referenzen auf Objekte enthalten.
Das obige ist der detaillierte Inhalt vonWarum kommt es beim C-Polymorphismus zum Slicing und wie kann es vermieden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!