理解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中文網其他相關文章!