面试题48:用C++设计一个不能被继承的类
解法一:把构造函数设为私有
将构造函数定义为私有,然后通过定义公有的静态函数来创建和释放类的实例。
1 class SealedClass 1 2 { 3 public: 4 static SealedClass1* GetInstance() 5 { 6 return new SealedClass1(); 7 } 8 static void DeleteInstance( SealedClass1* pInstance) 9 { 10 delete pInstance; 11 } 12 private: 13 SealedClass1(); 14 ~SealedClass1(){} 15 }
缺点:只能得到位于堆上的实例,得不到位于栈上的实例。
解法二:利用虚拟继承
class MakeSealed { friend SealedClass2; private: MakeSealed(); ~MakeSealed(); }; class SealedClass2:virtual public MakeSealed { public: SealedClass2(){} ~SealedClass2(){} };
SealedClass2是不能被继承的类。当一个类试图继承它时,在调用该类的构造函数时会直接跳过SealedClass2而直接调用MakeSealed的构造函数,因此会出现编译错误。