基于上面的分析,试图从FinalClass继承的类,一旦实例化,都会导致编译错误,因此是FinalClass不能被继承。但是我们可以这样来让FinalClass能够被继承:
#include <iostream.h> class Mytry; template <typename T> class MakeFinal { friend T; friend Mytry;//注意这里 private : MakeFinal() {cout<<"MakeFinal()------------------------------"<<endl;} ~MakeFinal() {} }; class FinalClass : virtual public MakeFinal<FinalClass> { public : FinalClass() {cout<<"FinalClass()------------------------------"<<endl;} ~FinalClass(){} }; class Mytry: public FinalClass { public : Mytry() {cout<<"Mytry()------------------------------"<<endl;} ~Mytry() {} };
在其他地方定义 Mytry A;编译则不会出错
最后,
相似的,我们也可以用多重继承,同样的思想(屏蔽私有构造函数的方法)来实现,代码如下:
#include <iostream> using namespace std;
template <typename T> class CFinalClassBase{ friend T; private: CFinalClassBase() { cout << "I am the CFinalClassBase" << endl; } ~CFinalClassBase() { } };
class XXX { public: XXX() { cout << "I am XXX" << endl; } ~XXX() { } };
class CParent:virtual public CFinalClassBase<CParent>, public XXX { public: CParent() { } ~CParent() { } }; class CChild: public CParent { };
int main(int argc, char* argv[]) { CParent a; // 可以构造 //CChild b; //不能构造 return 0; } 这样,我们只要继承自CFinalClassBase(或单继承或多重继承),我们就得到了不能继承的类了。当然,对纯静态成员的类是特例,我们无可奈何!另当别论!