首頁 >後端開發 >C++ >切片如何影響 C 中的多型行為?

切片如何影響 C 中的多型行為?

Barbara Streisand
Barbara Streisand原創
2024-12-04 02:14:14682瀏覽

How Does Slicing Affect Polymorphic Behavior in C  ?

理解C 中的多態性和切片

多態性是物件導向程式設計中的一個基本概念,它允許將不同類型的物件視為共同類型的物件。然而,在 C 中,這個概念可能伴隨著一種稱為切片的意外現象。

給定的程式碼片段示範了多態性和切片的範例:

#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();
}

執行時,此程式碼令人驚訝的是輸出「rawr」、「bark」、「 rawr”和“bark”。這是因為切片。當用“Dog”物件初始化“badDog”時,只有“Dog”物件的“Animal”部分被複製到“badDog”。因此,“badDog”仍然是“動物”,無法訪問“狗”行為。

在 C 中,與 Java 或 C# 等基於值的複製初始化引用的語言不同,應用值語義。複製類別物件會使用自己分配的記憶體建立該物件的單獨副本,從而導致切片。為了實現多態行為,C 中應該使用指標或引用,而不是直接將一種類型的物件指派給另一種類型的物件。

以上是切片如何影響 C 中的多型行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn