首頁 > 後端開發 > C++ > 切片如何影響 C 中的多態性?

切片如何影響 C 中的多態性?

Linda Hamilton
發布: 2024-11-30 21:51:19
原創
472 人瀏覽過

How Does Slicing Affect Polymorphism 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
登入後複製

您可能期望輸出為“rawr bark bark bark”,但物件badDog 的行為是動物而不是狗。這是因為切片。

當您將 badDog 建立為 Animal badDog = Dog() 時,您正在將 Dog 物件切片為 Animal。這意味著 badDog 只包含 Dog 中屬於 Animal 類別的部分,並且所有特定的 Dog 功能都會遺失。

要解決此問題,您需要使用指標或參考來衍生類別。指針或引用不會複製對象,因此它們可以保留其特定功能。例如,goodDog 指標成功地保留了它的 Dog 功能。

有些語言(例如 Java)預設具有引用語義,而 C 使用值語義。在 C 中,您明確表示需要使用指標或引用來實作引用語意。如果不這樣做可能會導致切片問題,如 badDog 範例所示。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板