视觉C++ dynamic_cast返回 NULL,尽管对象是派生类型



我有一个奇怪的问题,尽管表达式中给出的对象是派生类型,但dynamic_cast返回 NULL 指针,具有强制转换类型的继承路径。

不幸的是,我无法发布原始代码,所以这里是大致重建的情况:

我有以下类型的 clas 层次结构:

class A
class B
class C : public A, B
class D : public C

所有班级都有虚拟成员。

现在假设我有一个具体类型 D 的对象。

在将此对象作为 B* 传入的函数中,我有一个这种类型的强制转换:

C* func(B* pObject)
{
return dynamic_cast<C*>(pObject);
}

强制转换返回 NULL,尽管对象似乎定义良好。 VC++ 将鼠标悬停在 pObject 上时,在调试器中查看对象时将其报告为 D。(这会误导吗?

这个演员阵容应该有效吗? 伊莫 应该允许这种石膏。我错过了什么吗? 我该怎么做才能分析这个问题? 多重继承是否存在问题?

这是在Visual C++ 2013 Pro上,如果它有任何不同的话。

你的问题在别处。

考虑

#include <iostream>
struct A {};
struct B {virtual ~B() = default;};
struct C : A, B {};
struct D : C {};
int main()
{
D d;
D* pd = &d;
B* pb = dynamic_cast<B*>(pd);
C* pc = dynamic_cast<C*>(pb);
std::cout << pc; // this is not nullptr
}

这证明了当只有B(第二个强制转换中的源类型)是显式多态的时,可以从B*访问C*指向类型D对象的指针

。请参阅 https://ideone.com/ifxYgV

最新更新