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

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

DDD
發布: 2024-12-26 04:33:10
原創
430 人瀏覽過

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中文網其他相關文章!

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