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 的行為是動物而不是狗。這是因為切片。
當您將 badDog 建立為 Animal badDog = Dog() 時,您正在將 Dog 物件切片為 Animal。這意味著 badDog 只包含 Dog 中屬於 Animal 類別的部分,並且所有特定的 Dog 功能都會遺失。
要解決此問題,您需要使用指標或參考來衍生類別。指針或引用不會複製對象,因此它們可以保留其特定功能。例如,goodDog 指標成功地保留了它的 Dog 功能。
有些語言(例如 Java)預設具有引用語義,而 C 使用值語義。在 C 中,您明確表示需要使用指標或引用來實作引用語意。如果不這樣做可能會導致切片問題,如 badDog 範例所示。
以上是切片如何影響 C 中的多態性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!