gpt4 book ai didi

c++将基类转换为派生类困惑

转载 作者:可可西里 更新时间:2023-11-01 14:56:05 24 4
gpt4 key购买 nike

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

所以我将元素转换为它应该是的类型,但发现这行不通。

(derived_3)obj_to_be_fixed;

记住这是一个指针的东西。经过一些调整后,现在可以使用了。

*((derived_3*)&obj_to_be_fixed);

这是正确的还是有一个例如 abc_cast() 函数可以减少困惑?

编辑:

我不得不将其扩展到另一个问题,那里显示了完整的解决方案。 stackoverflow.com ... why-the-polymorphic-types-error-and-cleanup-question

最佳答案

如果您将对象存储在 std::vector<base> 中根本没有办法回到派生类。这是因为派生部分在将其存储在基类的实例中时已被切片(毕竟你的 vector 包含数据的拷贝,所以它很乐意只复制你的对象的基础部分),使存储的对象成为真正的实例基类,而不是用作基类的派生类。

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

关于c++将基类转换为派生类困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4631637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com