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

 

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

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

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

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

 

缺点:

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

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

 

新奇解法:虚继承

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

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

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

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

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-03-06
  • 2021-08-12
  • 2021-09-22
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-26
  • 2021-10-18
  • 2022-02-16
  • 2022-12-23
相关资源
相似解决方案