标签:
这个问题的传统解法是把构造和析构函数设为private,但是有很多不方便的地方,如无法直接定义它的对象。
一个非常开脑洞的做法是使用友元+虚继承来实现。
template<typename T> class A { friend T; private: A() {}; ~ A() {}; }; class B: virtual public A<B> { }; class C :public B { }; int main() { C c; return 0; }
定义类模版A为不可继承的类模版,并将构造和析构函数设为private,但是友元模版被具现化为不可被继承的那个类,目的是让该类可以访问构造和析构函数但是其他类不可以。
然而在实际中B的派生类C也可以通过B访问到A的构造和析构函数,于是将B改为虚继承,这样在构造C的对象的时候会跳过B先构造A的部分,但是C是无权直接访问A的,因此构造失败,从而禁止了C继承B。
注意,在C++11中加入了final这个关键字已经完美地解决了这个问题。
标签:
原文地址:http://www.cnblogs.com/rockzh/p/4625431.html