试题:实现一个不能被继承的类(下)

来源:互联网 发布:软件管理器 编辑:程序博客网 时间:2024/06/06 02:37
我们也不必气馁, 我们可以用类模板的特化来做, 实现如下:
template <class T>class FinalMaker;class A;template <>class FinalMaker<A>{private:    ~FinalMaker() { }    friend class A;};class A : virtual public FinalMaker<A>{};class B : public A{public:    static void static_func() { }    static int value;};int B::value = 0;int main(){    A a;//  B b; // error    B::static_func();    B::value = 1;    return 0;}

这样, 如果我们要把C也写成A这样: 我们仍然要做所有A做过的事(把FinalMacker以C为模板参数特化出一份代码):

class C;template <>class FinalMaker<C>{private:    ~FinalMaker() { }    friend class C;};class C : virtual public FinalMaker<C>{};

从代码量看, 类模板的方法比按最前面的代码再写一份关于C的, 都要多一些, 复杂些, 唯一的好处是, 我们不用再为命名而烦恼了

上面的代码中的:

template <class T>class FinalMaker;

我用的是FinalMaker的声明, 而非定义:

template <class T>class FinalMaker{private:    ~FinalMaker() { }};

其实, 两个方式都可以