c++设计一个不能被继承的类,为什么必须是虚继承?原因分析
2016-02-20 23:08
579 查看
转自:http://my.oschina.net/cuilili/blog/323696
用C++实现一个不能被继承的类(例1)
?
类Base的构造函数和析构函数因为是私有的,只有Base类的友元可以访问,B类在继承时将模板的参数设置为了B类,所以构造B类对象时们可以直接访问父类(Base)的构造函数。
通常每个类只初始化自己的直接基类,但是在虚继承的时候这个情况发生了变化,可能导致虚基类被多次初始化,这显然不是我们想要的。(例2: AA,AB都是类A的派生类,然后类C又继承自AA和AB,如果按之前的方法会导致C里面A被初始化两次,也会存在两份数据)
为了解决重复初始化的问题,从具有虚基类的类继承的类在初始化时进行了特殊处理,在虚派生中,由最低层次的派生类的构造函数初始化虚基类。在我们上面的例1中就是由C的构造函数控制如何进行虚基类的初始化。
为什么B类不能被继承?
回到例1,因为B是Base的友元,所以B对象可以正常创建,但由于B使用了虚继承,所以如果要创建C对象,那么C类的构造函数就要负责虚基类(Base)的构造,但是Base的构造函数是私有的,C没有访问的权限(ps:友元关系不能被继承的),所以例1中的C类在编译时就会报错。这样B类就不能被继承了。
----------------------------------------------------
吐槽一下:面试中被问到这个问题,虽然答出了实现方法,但是原理没回答上,于是回来之后查了一下
大家都说这属于“奇技淫巧”,哎,面试官就爱问这些 我也很无语啊
用C++实现一个不能被继承的类(例1)
?
为什么必须是虚继承(virtual)呢?
参见 c++Primer 4th 第17.3.7节 特殊的初始化语义通常每个类只初始化自己的直接基类,但是在虚继承的时候这个情况发生了变化,可能导致虚基类被多次初始化,这显然不是我们想要的。(例2: AA,AB都是类A的派生类,然后类C又继承自AA和AB,如果按之前的方法会导致C里面A被初始化两次,也会存在两份数据)
为了解决重复初始化的问题,从具有虚基类的类继承的类在初始化时进行了特殊处理,在虚派生中,由最低层次的派生类的构造函数初始化虚基类。在我们上面的例1中就是由C的构造函数控制如何进行虚基类的初始化。
为什么B类不能被继承?
回到例1,因为B是Base的友元,所以B对象可以正常创建,但由于B使用了虚继承,所以如果要创建C对象,那么C类的构造函数就要负责虚基类(Base)的构造,但是Base的构造函数是私有的,C没有访问的权限(ps:友元关系不能被继承的),所以例1中的C类在编译时就会报错。这样B类就不能被继承了。----------------------------------------------------
吐槽一下:面试中被问到这个问题,虽然答出了实现方法,但是原理没回答上,于是回来之后查了一下
大家都说这属于“奇技淫巧”,哎,面试官就爱问这些 我也很无语啊
相关文章推荐
- 人提醒电脑猜大小c++源代码
- OpenJudge百炼习题解答(C++)--题4108:羚羊数量-Number Of Antelope
- OpenJudge百炼习题解答(C++)--题4109:公共朋友-Common Friends
- neuq oj 1047: 谭浩强C语言(第三版)习题6.3 C++
- OpenJudge百炼习题解答(C++ )--题4112:情报破译-Cryptanalysis
- OpenJudge百炼习题解答(C++)--题2000:金币
- C与C++比较新增功能大全(完善中)
- OpenJudge百炼习题解答(C++)--题1936:全在其中
- C/C++程序编译步骤 如何生成可执行文件
- source insight用于C语言编程的工具脚本
- C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)
- c++笔试题总结2
- neuq oj 1044: 谭浩强C语言(第三版)习题5.8 C++
- C++操作二进制文件
- [C++]类模板
- C++学习之 构造函数中调用构造函数
- c++异常安全和copy and swap策略
- C++ 回调机制
- 重温C++ 之 重载操作符
- C++中的类所占内存空间总结