作者:cuigang 来源:C++博客   酷勤网收集 2008-04-08

摘要
  如果上面不是虚继承,那么 final 类的构造函数由 MyTest 的构造函数负责调用,因为是友元类,则调用成功,无法阻止 test 实例化。而一旦声明为虚继承,MyTest 不再负责调用 final 的构造函数,而由 test 来调用,那么因为不是友元类,实例化将失败,编译出错
在我的旧文中,曾经提到在 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 来调用,那么因为不是友元类,实例化将失败,编译出错,提示不能访问私有的构造函数。

来自:http://www.cppblog.com/cuigang/category/5805.html

分类: 编程语言 C/C++编程语言 修炼之道



关于酷勤 | 联系方式 | 免责声明 | 友情链接