题目:
写一个不能被继承的类
思路:
1、把构造函数设为私有函数
在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的构造函数,要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。
当一个类试图从它那继承的时候,必然会由于调用构造函数、析构函数而导致编译错误。
但如果构造函数 、析构函数都为私有函数,怎么得到该类型的实例呢?可以通过定义公有的静态函数来创建和释放类的实例。
这样我们只能得到位于堆上的实例,而得不到栈上的实例。
代码:
class SealedClass{ public: static SealedClass* GetInstance(){ return new SealedClass(); } static void DeleteInstance(SealedClass* pInstance){ delete pInstance; } private: SealedClass(){}; ~SealedClass(){}; };
2、虚拟继承
先看代码:
template<typename T> class MakeSealed{ friend T; private: MakeSealed(){}; ~MakeSealed(){}; }; class SealedClass:virtual public MakeSealed<SealedClass>{ public: SealedClass(); ~SealedClass(); }; class Try:public SealedClass{ public: Try(){}; ~Try(){}; };
类SealedClass是从类MakeSealed<SealedClass>继承过来的,在调用Try的构造函数的时候,会跳过SealedClass而直接调用MakeSealed<SealedClass>的构造函数,
但Try不是它的友元类型,因此不能调用它的私有构造函数,因此会编译出错。
缺点:移植性不好,SealedClass在VS能够编译,但GCC对friend的要求不同于VS,暂不支持模板参数类型作为友元类型。