C++中的动态铸造故障
Dynamic casting Failure in C++
我有以下类层次结构:
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就会工作。
相关文章:
- 分段故障(堆芯转储)矢量
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 数组的指针从不分段故障
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 分段故障 11,从类函数显示动态 C 字符串
- 试图创建动态分配的char数组时的分割故障
- 超载添加操作员和动态向量的分割故障
- 当有1个以上的对象时,动态字符串类断裂与SEG故障
- 在一个动态分配的数组的程序中分割故障
- C++-分段故障-动态数组
- 动态分配Array时出现奇怪的分段故障