首頁 > 後端開發 > C++ > 為什麼在 C 中將基底類別轉換為衍生類別經常失敗,有哪些更好的替代方案?

為什麼在 C 中將基底類別轉換為衍生類別經常失敗,有哪些更好的替代方案?

Linda Hamilton
發布: 2024-11-29 09:27:11
原創
739 人瀏覽過

Why Does Casting Base to Derived Classes in C   Often Fail, and What are the Better Alternatives?

在 C 中轉換為衍生類別

問題圍繞著無法將基底型物件轉換為衍生型別。由於缺少有效的構造函數或構造函數解析不明確,所提供的方法會導致錯誤。

理解繼承的概念在這裡至關重要。考慮動物層次結構:

class Animal { /* Some virtual members */ };
class Dog: public Animal {};
class Cat: public Animal {};
登入後複製

將基本類型物件(例如 Animal)分配給派生類型變數(例如 Dog)無需強制轉換,因為所有動物本質上都屬於基本類型類別。但是,嘗試在不使用動態轉換的情況下將衍生型別物件轉換回基本型別物件(例如,從 Dog 到 Animal)將導致切片,從而遺失衍生型別特定的資料。

動態轉換提供了一種安全的轉換方法派生類型物件返回到以多態方式儲存物件的基底類型容器:

std::vector<Animal*> barnYard;
barnYard.push_back(&dog);
barnYard.push_back(&cat);
barnYard.push_back(&duck);
barnYard.push_back(&chicken);

Dog* dog = dynamic_cast<Dog*>(barnYard[1]); // Note: NULL as this was the cat.
登入後複製

但是,使用動態轉換經常表明存在設計缺陷。相反,請考慮使用虛擬方法動態存取屬性:

void makeNoise(Animal& animal) { animal.DoNoiseMake(); }
Dog dog;
Cat cat;
Duck duck;
Chicken chicken;

makeNoise(dog);
makeNoise(cat);
makeNoise(duck);
makeNoise(chicken);
登入後複製

以上是為什麼在 C 中將基底類別轉換為衍生類別經常失敗,有哪些更好的替代方案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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