前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 12 - polymorphic class copy

C++ 12 - polymorphic class copy

作者头像
Reck Zhang
发布2021-08-11 11:03:15
2310
发布2021-08-11 11:03:15
举报
文章被收录于专栏:Reck Zhang

polymorphic class copy

多态类指存在至少一个虚函数继承关系的类. 当使用多态类的基类发生值拷贝时, 其隐式生成的拷贝构造函数和赋值运算符会导致一个问题: 派生类中只有基类部分被拷贝.

Example:

代码语言:javascript
复制
class B { // BAD: polymorphic base class doesn’t suppress copying
public:
    virtual char m() { return ‘B’; }
    // … nothing about copy operations, so uses default …
};

class D : public B {
public:
    char m() override { return ‘D’; }
    // …
};

void f(B& b)
{
    auto b2 = b; // oops, slices the object; b2.m() will return ‘B’
}

D d;
f(d);

解决方法:

  1. 实现virtual copy方法
代码语言:javascript
复制
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;
};
  1. delete基类的拷贝构造函数和赋值运算符, 在编译器报错:
代码语言:javascript
复制
class B { // GOOD: polymorphic class suppresses copying
public:
    B(const B&) = delete;
    B& operator=(const B&) = delete;
    virtual char m() { return ‘B’; }
    // …
};

class D : public B {
public:
    char m() override { return ‘D’; }
    // …
};

void f(B& b)
{
    auto b2 = b; // ok, compiler will detect inadvertent copying, and protest
}

D d;
f(d);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • polymorphic class copy
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档