C++11新特性(58)- 删除的拷贝控制和继承

本标题来自C++ Primer 5,作者也没有看懂。

作为C++11的新特性,允许程序员将某些函数定义为删除的以限制这些功能被使用。

引入了继承概念以后,事情变得稍微复杂一些。

代码示例

例如下面的基类:

这 个类只有一个数据成员,定义了默认构造函数,拷贝构造函数,移动构造函数,赋值运算符,移动运算符和析构函数。这些函数有一个共同特点:都是负责构造,复 制和销毁类实例的数据成员,负责类资源的管理。当这个类被继承时,相应的函数也会被重写,但是一般来讲派生类的类似操作中会调用基类的对应成员:

但是一旦基类中使用=delete来声明基类的某个成员函数为删除的,那么派生类中的对应函数也会自动地变成删除的。

观察下面的代码:

如果sub类没有从base类继承,由于有默认生成的函数,代码是可以通过编译的;一旦修改为从base继承,main函数中的对用操作就会出现编译错误。

其原因就是因为基类中的对应函数已经被定义为删除的了。

作者观点

按照作者的理解,原因可能是由于存在下面的关系:

派生类  is a 基类

也就是说:从语义上讲派生类的操作都应该包含基类的对应操作,一旦基类中的对应操作被声明为删除的,就意味这关于基类的那部分动作无法进行。为了安全起见,C++于是也认为派生类中的对应函数也是删除的。

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

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/81335414