怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?

“怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?”这是ADOBE公司的一道笔试题。

看了这道题目,笔者查阅了一些资料并结合自己的一些想法,写了这篇博客,有错误的地方请指出,谢谢。

首先看怎么防止类被继承。这里面介绍一种借用虚继承和友元机制实现的方法。其实说到底,防止一个类被继承,我们还是想怎么使的派生类在构造时不能够调用基类的构造函数,从而不能完成继承。我们都知道,派生类对象初始化时,首先要运行基类构造函数,将基类子对象进行初始化,之后再运行派生类的构造函数,初始化派生类中特质不同的成员。下面介绍一种方法:

首先定义一个基类Base,但在Base类中,其构造函数被定义为私有的。接下来Base1虚继承Base类,Base类成了虚基类,而Base1是Base的友元,可以调用Base的构造函数初始化对象。但是到了派生类Drived时候,它是最低层的派生类,按照规则“最低层派生类的构造函数初始化虚基类”,Drived类跨过Base1直接调用Base类中的构造函数去初始化虚基类部分的子对象,然而由于Base类的构造函数是私有的,Drived类的构造函数无权调用,因此初始化失败。这就导致了一个有趣的现象,Drived类继承Base1类,结果由于无法调用虚基类Base的构造函数而无法完成对象的创建,给人的感觉就是Base1类无法被继承。

再来看看问题的后半部分“对于不能被继承的类,怎么初始化及销毁它的实例?”这里不能被继承的类是Base1类,但是Base1类如果创建对象的话,可以正常的调用Base类和Base1类的构造函数和析构函数完成初始化和销毁操作。这也说明了,虚继承具有这样的特点:类A虚继承类B,类A的操作一切都正常,造成影响的是A的派生类C。因为虚基类A的派生类C要在构造非虚基类B之前去构造虚基类A。

有关虚继承的内容请见本人另一篇博客。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值