java 虚继承_c++设计一个不能被继承的类,为什么必须是虚继承?原因分析

用C++实现一个不能被继承的类(例1)

#include 

using namespace std;

template 

class Base{

friend T;

private:

Base(){

cout <

}

~Base(){}

};

class B:virtual public Base{   //一定注意 必须是虚继承

public:

B(){

cout <

}

};

class C:public B{

public:

C(){}     //继承时报错,无法通过编译

};

int main(){

B b;      //B类无法被继承

//C c;

return 0;

}

类Base的构造函数和析构函数因为是私有的,只有Base类的友元可以访问,B类在继承时将模板的参数设置为了B类,所以构造B类对象时们可以直接访问父类(Base)的构造函数。

为什么必须是虚继承(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类就不能被继承了。

----------------------------------------------------

吐槽一下:面试中被问到这个问题,虽然答出了实现方法,但是原理没回答上,于是回来之后查了一下

大家都说这属于“奇技淫巧”,哎,面试官就爱问这些 我也很无语啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值