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

多態性和切片如何影響 C 中的物件行為?

Patricia Arquette
Patricia Arquette原創
2024-12-02 05:20:09724瀏覽

How Does Polymorphism and Slicing Affect Object 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

這可能會令人驚訝,因為人們可能會期望輸出是「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中文網其他相關文章!

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