常规解法:将构造函数设为私有函数
C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。若将一个类的构造函数和析构函数都定义为私有函数,当一个类试图从它那继承的时候,必然会由于调用构造函数、析构函数而导致编译错误。
通过定义公有的静态函数来创建和释放类的实例。
缺点:
(1)和普通的类型有些不一样,使用起来有点不方便。
(2)只能得到位于堆上的实例,不能得到位于栈上的实例。
新奇解法:虚继承
可以在栈上、也可以在堆上创建实例。尽管 MakeSealed<SealedClass2> 的构造函数和析构函数都是私有的,但由于类 SealedClass2 是它的友元类型,因此在 SealedClass2 中调用 MakeSealed<SealedClass2> 的构造函数和析构函数都不会引起编译错误。
但如果试图从 SealedClass2 继承一个类并创建它的实例时,却不能通过编译。比如继承出 Try 类型:
由于 SealedClass2 是从类 MakeSealed<SealedClass2> 虚继承而来的,在调用 Try 的构造函数时,会跳过 SealedClass2 而直接调用 MakeSealed<SealedClass2> 的构造函数。然而,Try 不是 MakeSealed<SealedClass2> 的友元类型,因此不能调用它的私有构造函数。