首頁 >後端開發 >C++ >C 語言中如何避免物件切片來實現多型行為?

C 語言中如何避免物件切片來實現多型行為?

DDD
DDD原創
2024-12-26 04:33:10432瀏覽

How Can Object Slicing Be Avoided in C   to Achieve Polymorphic Behavior?

物件切片和多態性行為

在物件導向程式設計中,將衍生類別物件儲存在基底類別變數中可能會導致意外行為,稱為物件切片。當基類變數被指派派生類別的物件時,會出現此問題,導致派生類別特定的成員因物件切片而遺失。

範例:

考慮以下程序:

#include <iostream>
#include <vector>
using namespace std;

class Base {
public:
    virtual void identify() {
        cout << "BASE" << endl;
    }
};

class Derived : public Base {
public:
    virtual void identify() {
        cout << "DERIVED" << endl;
    }
};

int main() {
    Derived derived;

    vector<Base> vect;
    vect.push_back(derived);

    vect[0].identify();
    return 0;
}

在這個例子中,衍生類別物件匯出儲存在基底類別的向量中物件向量。然而,當呼叫基類物件 vect[0] 上的 recognize() 方法時,它輸出「BASE」而不是預期的「DERIVED」。

解決方案:

為了防止物件切片並實現多態性行為,正確的做法是在向量​​:

vector<Base*> vect;

透過使用指針,保留衍生類別特定的成員,從而允許所需的多態行為。

使用智慧指標的增強解決方案:

為了確保正確的記憶體管理,建議使用適當的智慧指標而不是原始指標指標:

vector<unique_ptr<Base>> vect;

這確保了使用資源獲取即初始化(RAII)自動管理基類物件的內存,使程式碼更加高效和強壯。

以上是C 語言中如何避免物件切片來實現多型行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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