【发布时间】:2014-01-03 14:47:37
【问题描述】:
如何继承具有私有复制构造函数和赋值运算符的不可复制类将禁止在派生类上使用复制构造函数和赋值运算符?请在单独回复时考虑以下情况,
如果,默认复制构造函数和赋值运算符是编译器在派生类中生成的,而不是程序员添加的
如果程序员在派生类中定义并声明复制构造函数和赋值运算符为public
如果程序员在派生类中定义并声明了复制构造函数和赋值运算符是私有的
【问题讨论】:
标签: c++ noncopyable
如何继承具有私有复制构造函数和赋值运算符的不可复制类将禁止在派生类上使用复制构造函数和赋值运算符?请在单独回复时考虑以下情况,
如果,默认复制构造函数和赋值运算符是编译器在派生类中生成的,而不是程序员添加的
如果程序员在派生类中定义并声明复制构造函数和赋值运算符为public
如果程序员在派生类中定义并声明了复制构造函数和赋值运算符是私有的
【问题讨论】:
标签: c++ noncopyable
1) 那么任何复制或赋值都将无法编译,因为编译器生成的复制构造函数和赋值运算符需要访问基类的那些。
2) 那将是程序员的错误。你希望你的类是不可复制和不可分配的,所以你不应该提供公共方法来这样做。编译器可能会产生警告,但代码会编译。
3) 然后赋值和复制会导致编译错误,如上面 1),除非被friend 函数或类调用,或者在同一类内部调用。
关键信息是您不应该为不可复制的类提供复制构造函数或赋值运算符。让继承机制自己提供必要的限制。
【讨论】:
默认的复制构造函数和赋值运算符是编译器在派生类中生成的,不是程序员添加的
隐式函数将尝试调用基类中的对应函数。这是不可能的,因为它们是基类私有的,所以你会得到一个编译错误。这就是基类的工作方式。
复制构造函数和赋值运算符由程序员在派生类中定义并声明为public
那么你就破坏了从基类继承的目的;您的派生类现在可以通过这些函数复制。
复制构造函数和赋值运算符由程序员在派生类中定义并声明为私有
再一次,你击败了基类并使你的类可复制;但仅限于其成员和朋友功能内。
【讨论】: