如何防止一个类被继承?

C++   View第一期:   
   /*此处一定要声明,否则在NonDerivableHelper类中将NonDerivable定义为友元类时,会认为是Private中的某个类*/  
class NonDerivable;
  namespace   Private{  
  class   NonDerivableHelper  
  {  
  NonDerivableHelper()   {}  
  friend   class   NonDerivable;  
  };  
  }  
  #ifdef   NDEBUG  
  #define   FINAL_CLASS  
  #else  
  #define   FINAL_CLASS   :   private   virtual   Private::NonDerivableHelper  
  #endif  
  class   NonDerivable   FINAL_CLASS  
  {  
  ...  
  };   
  
初次看到这个例子时,对其中的private virtual继承方法不是很理解。而这种继承方式恰恰是该例子的精华部分。在此引用San_Daniel(丹少爷)和xiterator(xi)的解释 。
 San_Daniel(丹少爷):

virtual在这里的意思是虚拟继承。它主要是为了解决多重继承时基类数据在子类中出现两次以上,从而引起访问二义的问题。例  
  class   A{  
  public:  
  int   i;  
  };  
  class   B:public   A  
  {};  
  class   C:public   A  
  {};  
  class   D:public   B,   public   C  
  {}//here   D   has   2   copy   of   A::i,   one   comes   from   B   and   another   comes   from   C  
  在上述情况下,对C::i的访问是二义的,但如果B,   C都虚拟继承A,编译器将保证这种情况不会出现。   

xiterator(xi):

类的继承体系中若有类成为virtual   base   class(即与其子类之间均通过virtual方式继承的话),那么其构造函数的调用是由最终具体类(本例WantToDerive)来做的。而WantToDerive是经由NonDerivable   private继承NonDerivableHelper,所以无法调用NonDerivableHelper的构造函数。     
  若将virtual去掉,则NonDerivableHelper构造函数的调用是由NonDerivable来做的,而NonDerivable是NonDerivableHelper的友元,所以可以访问相应的构造函数。 

从以上解释我们可以看到,该例子主要使用了C++中virtual继承方式和友元不能被继承的两个特性。通过将NonDerivableHelper 的构造函数定义为private,同时将子类NonDerivable声明为该类的友元类。因此NonDerivable可以实例化。但由于NonDerivable是通过virtual方式继承的NonDerivableHelper ,因此其子类的构造函数调用NonDerivableHelper 的构造函数时,是直接调用,而不是通过NonDerivable其调用,故出现“不能调用私有的NonDerivableHelper::NonDerivableHelper()”错误,从而实现了NonDerivable不能被继承的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值