专栏首页C++核心准则原文翻译C++核心准则C.130:实现多态类的深拷贝时,虚clone函数要比拷贝构造函数/赋值运算符好

C++核心准则C.130:实现多态类的深拷贝时,虚clone函数要比拷贝构造函数/赋值运算符好

C.130: For making deep copies of polymorphic classes prefer a virtual clone function instead of copy construction/assignment

C.130:实现多态类的深拷贝时,虚clone函数要比拷贝构造函数/赋值运算符好。‍

Reason(原因)

Copying a polymorphic class is discouraged due to the slicing problem, see C.67. If you really need copy semantics, copy deeply: Provide a virtual clone function that will copy the actual most-derived type and return an owning pointer to the new object, and then in derived classes return the derived type (use a covariant return type).

由于会发生切片问题,多态类的复制是不推荐的。如果你真的需要复制语义,就进行深拷贝:提供一个虚的克隆函数,这个函数可以复制实际的派生类型并返回一个指向新对象的所有权指针,同时在派生类中返回派生类型(使用共变量返回类型)

切片问题(slicing problerm):由派生类实例向基类实例赋值时发生的信息丢失。

共变量返回类型(covariant return type):当基类的虚函数被派生类覆盖时,如果基类的虚函数返回某个类,而派生类返回该类的派生类,也看做是成功的覆盖。‍

Example(示例)

class B {
public:
    virtual owner<B*> clone() = 0;
    virtual ~B() = default;

    B(const B&) = delete;
    B& operator=(const B&) = delete;
};

class D : public B {
public:
    owner<D*> clone() override;
    ~D() override;
};

Generally, it is recommended to use smart pointers to represent ownership (see R.20). However, because of language rules, the covariant return type cannot be a smart pointer: D::clone can't return a unique_ptr<D> while B::clone returns unique_ptr<B>. Therefore, you either need to consistently return unique_ptr<B> in all overrides, or use owner<> utility from the Guidelines Support Library.

一般情况下,推荐使用智能指针表现所有权(参见R.20)。但是因为语言规则,共变量返回类型不能是智能指针:当B::clone返回unique_ptr<B>时,D::clone不能返回unique_ptr<D>。因此,你要么在所有的覆盖都返回unique_ptr<B>,要么使用准则支持库中的onwer<>。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c130-for-making-deep-copies-of-polymorphic-classes-prefer-a-virtual-clone-function-instead-of-copy-constructionassignment


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

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

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

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则C.150:unique_ptr管理的对象要用make_unique()​构建

    make_unique gives a more concise statement of the construction. It also ensures ...

    面向对象思考
  • C++核心准则R.32: 通过​unique_ptr<widget>类型参数表示函数试图获取widget的所有权

    R.32: 通过unique_ptr<widget>类型参数表示函数试图获取widget的所有权

    面向对象思考
  • C++核心准则C.131: 避免无意义的getters和setters‍

    A trivial getter or setter adds no semantic value; the data item could just as w...

    面向对象思考
  • Reddit大热,伯克利PPT带你丝滑入门机器学习:知识点全面覆盖,笔记可搭配食用

    这份PPT来自伯克利CS 189/289课程,从线性代数复习,到线性回归、随机森林、Boosting……各种方法与其中的知识要点全面覆盖,简洁明晰。

    量子位
  • 人工智能会导致大量失业,你怕吗

    目前,我们很多货真价实的人类,对AI有一个经典的威胁论认识,那就是人工智能给我们带来的危险,除了替代人类毁灭人类外,就是造成大量失业。而最近的一次年会演讲中,让...

    企鹅号小编
  • iOS手势locationInView、translationInView的区别

    最近写了一个抽屉效果,工程中用到了translationInView,在这记录一下。

    roc
  • 【记忆卡片】linux网络命令

    Linux网络命令是我们比较常用的命令,重要性和使用频度都很高。Linux下网卡命名规律:eth0,eth1。第一块以太网卡,第二块。lo为环回接口,它的IP地...

    程序员互动联盟
  • 谷歌人工智能 解高中数学题,正确率只有35%

    前几天有一则新闻,说的是谷歌的DeepMind开发的人工智能,无法通过英国高中的数学考试。

    mixlab
  • 王兴说美团2019年要片区规模应用无人车,下了一盘什么棋?

    在北京向百度等企业发放首批无人车路测牌照后,自动驾驶汽车的曙光已经清晰可见。在许多人第一印象中,说到无人车可能会先想到乘用车,不过现在看来最先商用的无人车将来自...

    罗超频道
  • ONOS一键安装脚本

    工欲善其事,必先利其器。在部署SDN实践时,通常需要安装OVS和控制器等软件,经历过的同学都知道,很多时候会被一些细节卡住,影响生产效率。有时由于实验需要还需要...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券