剑指offer——不能被继承的类

 

 常规解法:将构造函数设为私有函数

C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。若将一个类的构造函数和析构函数都定义为私有函数,当一个类试图从它那继承的时候,必然会由于调用构造函数、析构函数而导致编译错误。

通过定义公有的静态函数来创建和释放类的实例。

 

缺点:

(1)和普通的类型有些不一样,使用起来有点不方便。

(2)只能得到位于堆上的实例,不能得到位于栈上的实例。

 

新奇解法:虚继承

可以在栈上、也可以在堆上创建实例。尽管 MakeSealed<SealedClass2> 的构造函数和析构函数都是私有的,但由于类 SealedClass2 是它的友元类型,因此在 SealedClass2 中调用 MakeSealed<SealedClass2> 的构造函数和析构函数都不会引起编译错误。

但如果试图从 SealedClass2 继承一个类并创建它的实例时,却不能通过编译。比如继承出 Try 类型:

由于 SealedClass2 是从类 MakeSealed<SealedClass2> 虚继承而来的,在调用 Try 的构造函数时,会跳过 SealedClass2 而直接调用 MakeSealed<SealedClass2> 的构造函数。然而,Try 不是 MakeSealed<SealedClass2> 的友元类型,因此不能调用它的私有构造函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值