11

如果我要创建一个名为的基类和名为的派生base类等...我使用基类的实例集合,那么当我检索一个元素并尝试使用它时,我会发现 C++ 认为它的类型是基类的,可能是因为我从基类中检索到它。当我想使用仅存在于特定派生类的功能时,这是一个问题,当我将它放入向量时,我知道该对象的类型。derived_1derived_2std::vector

所以我将元素转换为它应该是的类型,发现这不起作用。

(derived_3)obj_to_be_fixed;

并记住这是一个指针。经过一些调整后,现在工作了。

*((derived_3*)&obj_to_be_fixed);

这是正确的还是有一个abc_cast()功能可以减少混乱?

编辑:

我不得不将其扩展到另一个问题,那里显示了完整的解决方案。stackoverflow.com ...为什么多态类型错误和清理问题

4

4 回答 4

21

如果将对象存储在 astd::vector<base>中,则根本无法返回派生类。这是因为派生部分在将其存储在基类的实例中时已被切片(毕竟您的向量包含数据的副本,因此它很高兴只复制对象的基础部分),使存储的对象成为真正的实例基类,而不是用作基类的派生类。

如果您想将多态对象存储在向量中,请使其成为std::vector<base*>(或某种指向基址的智能指针,但不是基址本身)并使用dynamic_cast<derived_3*>将其转换为正确的类型(或者static_cast,如果它的性能敏感并且您有足够的信心正在尝试转换为正确的类型(在这种情况下,如果你错了会发生可怕的事情,所以要小心))。

于 2011-01-08T00:55:07.220 回答
5

如果您使用 a vectorofbase那么您的所有实例都是base实例而不是派生实例。

如果您尝试插入派生实例,则该对象将被切片。插入到一个vector总是涉及一个副本,目标类型由向量持有的对象的类型决定。Avector不能容纳不同类型的对象。

于 2011-01-08T00:51:18.970 回答
1

大多数情况下,您不需要这样做。精心设计的类层次结构可以通过多态(即虚函数)来处理这个问题。

如果您确实需要强制转换为派生类型,请使用dynamic_cast运算符。

于 2011-01-08T00:49:25.323 回答
0

您尝试做的事情甚至是遥不可及的。如果存储在容器中的对象具有 type base,那么它们就是base, period 。它们不是derived对象,它们永远不会成为对象,并且无论您做什么derived,它们都不能用作对象。derived

您通过指针进行的转换只不过是一种将对象占用的内存重新解释basederived对象的技巧。这是完全没有意义的,只能偶然“工作”。

于 2011-01-08T00:56:32.100 回答