C++中的动态铸造故障

Dynamic casting Failure in C++

本文关键字:故障 动态 C++      更新时间:2023-10-16

我有以下类层次结构:

class A {
virtual void blah() = 0;
};
class B {
virtual void gah() = 0;
};
class C: public A, public B {};
class D: public C {
gah() {}
blah() {}
};

如果我执行以下操作:

A *something = new D();
auto a = dynamic_cast<B *>(something);
if(a == nullptr) std::cout << "NULL" << std::endl;

它在我正在运行的程序的上下文中打印"NULL"(我简化了代码,使其易于阅读(。这表明动态强制转换失败。

但如果我这样做:

A *something = new D();
auto a = dynamic_cast<C *>(something);
auto b = dynamic_cast<B *>(a);
if(a == nullptr) std::cout << "NULL" << std::endl;

它不会打印"NULL"并且dynamic_cast成功。你知道为什么会这样吗?我考虑过内联,但我确保每个类都有一个虚拟析构函数,并生成了一个对象文件。

还请原谅任何小的语法错误,这个想法应该很清楚。

感谢您的帮助。

基本上dynamic_cast失败是因为两个类冲突,破坏了一个定义规则。链接器、编译器和我都未能发现这一点(项目相当大,其中一些隐藏在我没有写的库中(。所以,是的,确保你的类没有冲突,然后dynamic_cast就会工作。