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
這可能會令人驚訝,因為人們可能會期望輸出是「rawr bark bark bark」。不同之處在於 badDog 賦值中使用了切片:
Animal badDog = Dog();
在這種情況下,Dog 的資料被切片到 Animal 物件中,導致 Dog 特定資訊的遺失。這是因為 Dog() 創建了一個 Dog 對象,但是當將其分配給 badDog(這是一個 Animal 對象)時,僅複製了 Dog 的 Animal 部分。
為了避免切片,可以使用指標或引用:
Animal* badDogPtr = new Dog(); Animal& goodDogRef = dog;
指標和引用的行為符合預期並允許多態性行為。這是因為它們引用或保存對物件的引用,而不是像值語義那樣擁有物件的副本。
在 Java 和 C# 等語言中,引用語意是預設值,而在C ,值語意是預設的。對於 C 中的多態行為,明確使用引用或指標是必要的。
以上是多態性和切片如何影響 C 中的物件行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!