Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 386, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

virtual friend的实现

一、友元概述:
friend并没有打破类的封装,我们可以把friend看出是类的一个公有(public)接口。
友元声明的位置可以位于公有、私有或被保护部分,位置无关紧要。
friend方法和类方法的区别就是firend调用f(x),成员方法x.f().像下面的友元方法要注意它的声明顺序:
class sample{
   friend void Remote::set(sample &t,int c);
   .........
},在这里的声明顺序如下:
class sample;//前置声明
class Remote{........};
class sample{............};
如果一个函数需要访问两个类的私有数据,那么这样的函数可以是其中一个类的成员,同时又是另一个类的友元,不过把函数作为两个类的友元更合理些。
二、virtual friend
下面的代码实现了一个virtual friend。
class Base {
 public:
   friend void f(Base& b);
   ...
 protected:
   virtual void do_f();
   ...
 };
 
 inline void f(Base& b)
 {
   b.do_f();
 }
 
 class Derived : public Base {
 public:
   ...
 protected:
   virtual void do_f();  // "Override" the behavior of f(Base& b)
   ...
 };
 
 void userCode(Base& b)
 {
   f(b);
 }

posted on 2009-06-03 22:40 Benjamin 阅读(497) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理