0
点赞
收藏
分享

微信扫一扫

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

small_Sun 2022-07-29 阅读 27


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

 

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

 

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

 

代码示例

 

例如下面的基类:

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

 

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

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

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

 

观察下面的代码:

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

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

 

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

 

作者观点

 

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

 

派生类  is a 基类

 

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

 

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

阅读更多更新文章,关注微信公众号【面向对象思考】

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

举报

相关推荐

0 条评论