dynamic_cast<D *>(pb) 返回空值
dynamic_cast<D *>(pb) return null
在C++入门(5th)19.2.1中关于dynamic_cast。它说,为了dynamic_cast<type*>(e)
成功,
E 的类型必须是公共派生自的类类型 目标类型、目标类型的公共基类或与目标相同 类型
但是,对于以下代码:
class B{
public:
virtual ~B(){}
};
class D : public B{};
B *pb = new B;
D *pd = dynamic_cast<D*>(pb);
if(pd == 0) cout << "err" << endl;
输出为"错误"。但是 pb 的类型是 D 类型的公共基类。
这是C++入门(第5版)中的错误吗?还是我只是误解了这些话?
pb
的类型确实是D
的公共基类,但pb
指向的对象不是任何类型D
对象的基子对象。动态强制转换检测到这一点并返回 null。
如果您确实尝试将指针强制转换为 D
对象的基子对象,您将获得指向D
对象的(非 null)指针:
D obj;
B *pb = &obj; // points at subobject
assert(&obj == dynamic_cast<D*>(pb));
您引用的要求只是一个静态要求,它允许您使用动态强制转换 - 但它没有描述使用强制转换的结果。这在后面会描述。
dynamic_cast
可以用作检测一个对象是否派生自另一个对象的工具,在您编写的代码中,答案是否定的,因此您得到了一个 null。由
B *pb = new B;
D *pd = dynamic_cast<D*>(pb);
你正在将一个基础向下投射到派生的,这与文档所说的相反。当然,如果pb
指向一个扩展D*
,你可以有下面:
B *pb = new D; // <--- It is a `D`
D *pd = dynamic_cast<D*>(pb);
相关文章:
- 使用 const char* 键映射 C++ 检索空值
- 返回空值的字符串值
- boost::any 如何检查空值/未定义的值
- C++ - 无法从基类继承 |提供空值
- C++空值和此指针
- 使用 cin 或 getline() 输入空值
- 可变参数列表是否以空值终止?
- 如何将整数重新初始化/设置为空值
- 检查构造函数的空值
- 无法从Linux,C ++执行"my_script" python脚本"main(filename)"功能;pModule = PyImport_Import(pName);返回空值
- 使用Nlohmann JSON将JSON数据保存在文件中时获取空值
- 在命名空间中定义变量,但在测试中获取空值
- 将 CURL 转换为字符串时为空值
- QCharts - 在 QLineSeries 中创建一个中断(空值)
- 动态强制转换返回空值
- SDL 表面返回空值
- ptrA = ptrB 是否等同于 ptrA = &*ptrB?,空值是否共享一个地址空间?
- 如何将 libpq 中的空值与C++绑定
- 尝试访问 json dataC++ 时获取空值
- dynamic_cast<D *>(pb) 返回空值