在我的旧文中,曾经提到在 C++ 中实现 Java 的 final 功能,但每次都要写一个基类比较麻烦,今次用模板把它加强。
1 template<class T>
2 class final{
3 friend T;
4 private:
5 final(){};
6 };
7
8 class MyTest : public virtual final<MyTest>{
9 public:
10 MyTest(){};
11 };
这样以后就可以直接继承模板类 final<T>,而不用每次都写一个类。
在这里顺便说一下,为什么一定要虚继承,假设我们有
1 class test : public MyTest{};
如果上面不是虚继承,那么 final 类的构造函数由 MyTest 的构造函数负责调用,因为是友元类,则调用成功,无法阻止 test 实例化。而一旦声明为虚继承,MyTest 不再负责调用 final 的构造函数,而由 test 来调用,那么因为不是友元类,实例化将失败,编译出错,提示不能访问私有的构造函数。