Heim >Backend-Entwicklung >C++ >Warum kommt es beim C-Polymorphismus zum Slicing und wie kann es vermieden werden?

Warum kommt es beim C-Polymorphismus zum Slicing und wie kann es vermieden werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-28 05:35:22915Durchsuche

Why Does Slicing Occur in C   Polymorphism, and How Can It Be Avoided?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn