禁用拷贝类函数

看网上的方法,三种当中的一种是,实现一个父类:

class uncopyable{
protected:
    uncopyable(){}
    ~uncopyable(){}
private:
    uncopyable(const uncopyable&);
    uncopyable& operator=(const uncopyable&);
}

然后让子类继承父类,这里我一直对public private protected理解不透,子类继承为啥一定要private,还有就是类uncopyable为啥将构造和析构设置为protected???

关于public private protected,有没有好的介绍资料,网页or书都ok.

阅读 1.9k
2 个回答

· 既然是 uncopyable 那自然就是不可拷贝的,那拷贝构造和赋值函数自然要是私有的(连子类也不能调用否则就不是uncopyable了),你也可以使用

uncopyable(const uncopyable&) = delete;
uncopyable& operator=(const uncopyable&) = delete;

简洁明了

· 把构造函数和析构函数设为protected的确不是个明智的办法,因为哪怕你在子类中重载了构造函数和析构函数,你也无法藉由基类指针来析构对象,这样的话很多功能比如智能指针都会报错。
如果只是想阻止别人实例化对象的话而只将其作为接口的话,你完全可以使用纯虚类来完成。

public:
    uncopyable() {}
    virtual ~uncopyable() = 0;
  1. 子类继承不是要private吧,public或者protected都行。
  2. 对于nocopyable的构造函数和析构函数

    • 不能是public,否则外部可以直接构造nocopyable
    • 不能是private,否则派生类没法访问,派生类没法构造
    • 只能是protected,基类protected属性在派生类中可以访问
  3. 继承权限关系

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题