专栏首页C++核心准则原文翻译C++核心准则C.148:使用dynamic_cast进行指针类型转换时,将不能发现目标类看作是有效的选项

C++核心准则C.148:使用dynamic_cast进行指针类型转换时,将不能发现目标类看作是有效的选项

C.148: Use dynamic_cast to a pointer type when failure to find the required class is considered a valid alternative

C.148:使用dynamic_cast进行指针类型转换时,将不能发现目标类看作是有效的选项

Reason(原因)

The dynamic_cast conversion allows to test whether a pointer is pointing at a polymorphic object that has a given class in its hierarchy. Since failure to find the class merely returns a null value, it can be tested during run time. This allows writing code that can choose alternative paths depending on the results.

dynamic_cast转换允许检查是否指针指向一个在其继承结构中包含给定类的多态对象。由于转换失败的结果仅仅是返回一个空值,这个结果可以在执行时检查。这个特性允许根据结果选择不同的路径。

Contrast with C.147, where failure is an error, and should not be used for conditional execution.

和C.147不同,那里的失败是错误,而且不应该被用于条件执行。

Example(示例)

The example below describes the add function of a Shape_owner that takes ownership of constructed Shape objects. The objects are also sorted into views, according to their geometric attributes. In this example, Shape does not inherit from Geometric_attributes. Only its subclasses do.

下面的例子描述的是Shape_owner的增加函数,它接受构造出来的Shape对象的所有权。对象也会在根据它们的几何属性有序加入views容器。在这个例子中,图形没有从几何属性继承。只有它的子类这么做了。

void add(Shape* const item)
{
  // Ownership is always taken
  owned_shapes.emplace_back(item);

  // Check the Geometric_attributes and add the shape to none/one/some/all of the views

  if (auto even = dynamic_cast<Even_sided*>(item))
  {
    view_of_evens.emplace_back(even);
  }

  if (auto trisym = dynamic_cast<Trilaterally_symmetrical*>(item))
  {
    view_of_trisyms.emplace_back(trisym);
  }
}
Notes(注意)

A failure to find the required class will cause dynamic_cast to return a null value, and de-referencing a null-valued pointer will lead to undefined behavior. Therefore the result of the dynamic_cast should always be treated as if it may contain a null value, and tested.

寻找所需类的失败会导致dynamic_cast返回一个空值,而解引用一个空指针会引起无定义的行为。因此应该总是认为dynamic_cast的结果可能为空并进行检查。

Enforcement(实施建议)
  • (Complex) Unless there is a null test on the result of a dynamic_cast of a pointer type, warn upon dereference of the pointer.
  • (复杂) 如果在dynamic_cast执行之后,没有对结果指针进行空判断,那么对使用这个指针的代码报警。

原文链接:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c148-use-dynamic_cast-to-a-pointer-type-when-failure-to-find-the-required-class-is-considered-a-valid-alternative


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则编译边学-F.17 输入/输出参数传递非常量引用

    This makes it clear to callers that the object is assumed to be modified.

    面向对象思考
  • C++核心准则ES.84:不要定义无名局部变量

    ES.84: Don't try to declare a local variable with no name

    面向对象思考
  • C++核心准则Enum.2: 使用枚举表现一组相关的命名常量

    An enumeration shows the enumerators to be related and can be a named type.

    面向对象思考
  • 利用人工智能的监控和响应系统协助东南亚医院应对COVID-19(CS)

    为了解医疗机构的现状,本研究提出了一种用于监测和响应COVID-19的系统,该系统可以帮助东南亚的国家明确激增的患者数目和呼吸机等重要设备的短缺情况。同时,该系...

    Pamela_Lin
  • 一种用于语音情感识别中转移学习的改良距离损失的连体神经网络(CS CV)

    自动情感识别在人机交互过程和物联网技术设计中发挥着重要作用。然而,情感识别系统的一个普遍问题在于可靠标签的稀缺。通过对感兴趣的样本之间的成对差异进行建模,连体网...

    刘持诚
  • 通过结构保留干预量化因果关系(CS AI)

    我们引入“因果信息贡献(CIC)”和“因果方差贡献(CVC)”来量化因果有向无环图中每个变量对某些目标变量的影响。CIC基于基础功能因果模型(FCM),在该模型...

    刘子蔚
  • Reading books

    Maybe reading is the most valuable thing in my life.

    宋天伦
  • 无限视距微分模型预测控制(CS SC)

    本文提出了一种用于安全仿学习的可微线性二次模型预测控制(MPC)框架。 使用从离散时间代数Riccati方程(DARE)获得的终端成本函数强制执行无限水平成本,...

    非过度曝光
  • 动态合并点预测(CS AR)

    经过几十年的研究,条件分支的错误预测仍然给性能带来了很大的问题。此外,对无限大小预测器的极限研究表明,许多剩余的分支是当前策略无法预测的。我们的工作重点是在面对...

    刘持诚
  • Learning to Remember More with Less Memorization

    (Submitted on 5 Jan 2019 (v1), last revised 20 Mar 2019 (this version, v2))

    用户1908973

扫码关注云+社区

领取腾讯云代金券