我有一个奇怪的问题,尽管表达式中给出的对象是派生类型,但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