ala*_*ere 11 c++ casting class base-class derived-class
如果我要创建一个名为基类base和派生类叫derived_1,derived_2等...我用的是基类的实例的集合,然后当我取回的元素,并尝试使用它,我会发现C++认为它的类型是基类的,可能是因为我从一个基类中检索到它std::vector.当我想使用仅存在于特定派生类的特征时,这是一个问题,我知道这个对象是我将它放入向量时的类型.
所以我将元素转换为它应该是的类型,并发现这不起作用.
(derived_3)obj_to_be_fixed;
Run Code Online (Sandbox Code Playgroud)
并记得这是一个指针的事情.经过一些调整后,现在已经奏效了.
*((derived_3*)&obj_to_be_fixed);
Run Code Online (Sandbox Code Playgroud)
这是正确的,还是有一个abc_cast()功能可以减少混乱?
编辑:
我不得不把它扩展到另一个问题,那里展示了完整的解决方案.stackoverflow.com ... why-the-polymorphic-types-error-and-cleanup-question
Gri*_*zly 19
如果将对象存储在a中std::vector<base>,则根本无法返回到派生类.这是因为派生的部分在将其存储在基类的实例中时已被切片(毕竟你的矢量包含数据的副本,所以它很乐意只复制你的目标的基础部分),使存储的对象成为真正的实例基类,而不是用作基类的派生类.
如果你想在向量中存储多态对象使它成为std::vector<base*>(或某种智能指针到基础,但不是基础本身)并使用dynamic_cast<derived_3*>它将其强制转换为正确的类型(或者static_cast,如果它的性能敏感,你对自己有足够的信心正试图投射到正确的类型(在这种情况下,如果你错了会发生可怕的事情,所以要小心)).
如果您使用的vector是base所有实例,则base实例而不是派生实例.
如果您尝试插入派生实例,则对象将被切片.插入vector始终涉及副本,目标类型由向量所包含的对象的类型确定.A vector不能容纳不同类型的对象.