c++ - 将基类转换为派生类时 dynamic_cast 失败
问题描述
我有两个类,基类和派生类。基类有一个虚方法。
这是我的测试示例:
class Base
{
public:
virtual void Hello() { cout << "-> Hello Base" << endl; }
};
class Derived: public Base
{
public:
void Hello() { cout << "-> Hello Derived" << endl; }
};
int main()
{
Base *mBase = new Base;
// something to do
....
Derived *mDerived = dynamic_cast<Derived*>(mBase);
mDerived->Hello();
return 0;
}
我正在寻找使用 to 转换后Hello()
派生的类的方法。mBase
mDerived
但问题是,当我尝试使用dynamic_cast
它时,应用程序会崩溃,否则如果我使用该类reinterpret_cast
的Hello()
方法,Base
则会被调用。
案例结果dynamic_cast
:
Segmentation fault (core dumped)
案例结果dynamic_cast
:
-> Hello Base
解决方案
将基类转换为派生类时 dynamic_cast 失败
这是应该发生的事情。当您将指针动态转换为指向其动态类型不是转换类型的对象时,您会得到一个空指针作为结果。
在您的示例中,您间接通过空指针并尝试调用导致未定义行为的成员函数。
使用动态转换时,您必须始终检查是否为 null。
如果我使用 reinterpret_cast ...
然后行为仍然是未定义的,因为您将通过指向不存在的对象的指针进行间接。除非创建派生类的实例,否则不能调用其非静态成员函数。
您可以将基本实例转换为派生实例,例如:
Base b;
Derived d = b;
发生的情况是派生实例的基本子对象是从 复制初始化的b
。
推荐阅读
- ios - RxSwift 不会将数据从一个 ViewController 推回另一个
- azure - 在 Azure 存储上启用静态网站未显示在选项列表中
- android - buildSrc 中自定义 gradle 插件中的类不会打包到 apk 中
- java - 是这个错误org/apache/commons/logging/LogFactory java.lang.NoClassDefFoundError的Logger类方法的模拟解决方案吗?
- java - Google Cloud SQL api export csv:自定义分隔符,处理“N”值并设置 utf8mb64
- list - raku 从头到尾做转子的更好方法是什么?
- magento - Magento 2 + WHM + SSL + Varnish 配置问题
- vue.js - vue2-datepicker 不能禁用未来的日期
- arrays - 合并元组和 numpy 数组
- codeigniter - 如何一次自动加载 codeigniter4 库并在控制器、模型、视图中的每个位置访问它,就像在 CI3 中一样