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