我们也不必气馁, 我们可以用类模板的特化来做, 实现如下:
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() { }
};
其实, 两个方式都可以