c ++将基类强制转换为派生类

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,如果它的性能敏感,你对自己有足够的信心正试图投射到正确的类型(在这种情况下,如果你错了会发生可怕的事情,所以要小心)).


CB *_*ley 5

如果您使用的vectorbase所有实例,则base实例而不是派生实例.

如果您尝试插入派生实例,则对象将被切片.插入vector始终涉及副本,目标类型由向量所包含的对象的类型确定.A vector不能容纳不同类型的对象.

  • @ alan2here:"向量可以包含多种类型".我担心这根本不是真的.如果你使用`std :: vector <base*>`你有一个指针向量.指针可以指向不同类型的对象,但指针本身都是相同的类型.现在,因为你的向量是一个指针向量,你知道必须管理这些指针指向的对象所在的位置,因为对象不再存储在向量中. (2认同)