首页 >后端开发 >C++ >为什么在 C 中将基类转换为派生类经常失败,有哪些更好的替代方案?

为什么在 C 中将基类转换为派生类经常失败,有哪些更好的替代方案?

Linda Hamilton
Linda Hamilton原创
2024-11-29 09:27:11716浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn