友元类问题?

littlebee 2002-06-19 12:08:31
曾在一本书上看到如下的情况:
class B;
class C;
class A
{
.....
friend class B;
friend class C;
.....
};

class B:public A
{
....
};

class C:public A
{
.....
};

我不知道他为什么这样写,这样写有什么好处?

...全文
82 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
huzhangyou 2002-06-22
  • 打赏
  • 举报
回复
B、C就可以访问A的private成员。
LionEagle 2002-06-22
  • 打赏
  • 举报
回复
to jinfeng_wang(一天只需(许)来一次):

不同意你的观点,友员的确破坏封装

“当一个类的两部分会有不同数量的实例或者不同的生命周期时,你经常需要将一个类分割成两部分。在这些情况下,两部分通常需要直接存取彼此的数据(这两部分原来在同一个类中,所以你不必增加直接存取一个数据结构的代码;你只要将代码改为两个类就行了)。实现这种情况的最安全途径就是使这两部分成为彼此的友元。”

这种做法并不安全,“两部分通常需要直接存取彼此的数据”但不一定是全部的数据,也就是说一般并不需要暴露所有的数据,但用友员的话,无论你愿不愿意都是全部暴露的。而且如果这两个部分一旦作了修改,比如增加一个私有的成员函数或成员变量,都可以被对方使用,这不一定是希望的结果
maphis 2002-06-19
  • 打赏
  • 举报
回复
A可以访问B,C的私有成员。
继承和友元没什么关系
maphis 2002-06-19
  • 打赏
  • 举报
回复
A可以访问B,C的私有成员。
继承和友元没什么关系
garfield_82 2002-06-19
  • 打赏
  • 举报
回复
可能是为了测试某个ide的class tree viewer的功能吧 :P
littlebee 2002-06-19
  • 打赏
  • 举报
回复
忘了一点,好像基类为空,就是没有member data和member function
chenqing1128 2002-06-19
  • 打赏
  • 举报
回复
本人觉的没有必要声明友类,就是为了允许他访问,既然作为基类,当然可以访问。所以我认为没有必要
北极猩猩 2002-06-19
  • 打赏
  • 举报
回复
这样B、C就可以访问A的private成员。
苏格拉顶777 2002-06-19
  • 打赏
  • 举报
回复
效率可以提高一点点,但其实用内联的编译方法编译出来后效率也不会有多少差别。顶多提高10%到20%左右,实际上只要类库设计得好,根本没有需要使用友元。友元的名字起得确实不好,叫“盗贼”比较合适。
littlebee 2002-06-19
  • 打赏
  • 举报
回复
我可以肯定一点,这个例子不是C++教程上的,
而是一本讲专家系统的书上给的例子程序,且A类为空!!!!!!!
其实我知道友元类可以访问私有成员,但是我不知道他为什么要
这样做,这样做到底会产生什么效果或好处!!!!
llin_9461 2002-06-19
  • 打赏
  • 举报
回复



B和C被声明成了A的友元,这样它们可以访问A的私有成员,它增加了程序的灵活

性,但打破了类的封装性。
天外飞狐 2002-06-19
  • 打赏
  • 举报
回复
但是这样就失去了class的封装性,最好不用。发贴的那个例子好像使用来说明什么,大家不用计较
sokoban 2002-06-19
  • 打赏
  • 举报
回复
这样做使普通函数直接访问一个类的保护或私有成员,可以提高效率!
diaopeng 2002-06-19
  • 打赏
  • 举报
回复
即使是B、C继承于A,B、C仍无法访问A中的私有数据,但作为A的友元就可以访问了
diaopeng 2002-06-19
  • 打赏
  • 举报
回复
别忘了A是B、C的基类,A不可以访问B、C中非继承部分的数据,但声明B、C为A的友元类,使得B、C中的任何函数有权访问A中的私有数据,目的就是为了这个。
上帝的小羊 2002-06-19
  • 打赏
  • 举报
回复
这样用会不会出问题
苏格拉顶777 2002-06-19
  • 打赏
  • 举报
回复
即使是继承也不能访问私有成员的,友员的权利太大了,超过了继承。
苏格拉顶777 2002-06-19
  • 打赏
  • 举报
回复
友元破坏了封装性,应该尽量避免使用,其实完全可以不用。
gunyeah 2002-06-19
  • 打赏
  • 举报
回复
这里和继承没有什么关系的,A可以访问C,B
其实就是这样

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧