如何在子类指针数组中使用dynamic_cast?返回E**编译失败求解
问题分析与解决方案
为什么e_t**无法转换为E**
C++不允许直接将e_t**转换为E**(哪怕E是e_t的派生类),核心原因是二级指针转换会破坏类型安全:
- 假设
e_t**指向的是一个e_t*类型的变量,如果强行转成E**,你可以通过这个指针给该变量赋值一个其他派生类(比如F*,F继承自e_t但和E无关)的指针。后续当代码用E*类型访问这个变量时,会触发未定义行为。 - 此外,
dynamic_cast仅支持单级指针/引用的多态类型转换,不支持二级指针的跨类型转换,这也是你编译失败的直接原因。
可行的解决方案
方案1:调整返回类型为E*
如果你的核心需求是获取找到的E类型对象的指针,直接返回转换后的单级指针即可,这是合法且安全的:
E* First() { for (size_t x = 0; x < Total; ++x) { E* ptr = dynamic_cast<E*>(*(Source + x)); if (ptr != nullptr) { return ptr; } } return nullptr; }
方案2:若必须返回E**,使用reinterpret_cast
如果你确实需要返回指向数组中对应元素的二级指针,在已经确认该位置的e_t*可以安全转换为E*的前提下,可以使用reinterpret_cast进行强制转换:
E** First() { for (size_t x = 0; x < Total; ++x) { if (dynamic_cast<E*>(*(Source + x)) != nullptr) { return reinterpret_cast<E**>(Source + x); } } return nullptr; }
注意:这种转换绕过了编译器的类型检查,仅在你能严格保证该位置的指针始终是E*类型时使用,避免后续操作引入类型错误。
内容的提问来源于stack exchange,提问作者blueperfect
相关产品推荐
相关产品推荐

