问题:在c++primer(中文第四版)第15.2.6节,讲了友元关系在类继承上的有效性,其中注解部分强调:
(1)友元关系不能继承。(2)基类的友元对派生类的成员没有特殊的访问权限。(3)如果基类被授予友元关系,
则只有基类具有特殊的访问权限,该基类的派生类不能访问授予友元关系的类。
很精炼,就是理解起来有点晦涩。还好作者提供了例子程序做注解,更可贵的是这个例子是错的,才没让有心的读者稀里糊涂的接受。
例子:
class Base{
friend class Frnd;
protected:
int i;
};
class D1:public Base{
protected:
int j;
};
class Frnd{
public:
int mem(Base b){return b.i;}
int mem(D1 d){return d.i;}//i is inherent from BASE, it's ok.书上为error
//d.j is not allowed.
};
class D2:public Frnd{ //D2 isn't BASE's friend, though it inherent from Frnd.
int mem(Base b){ return b.i; }
};
红色部分书上认为是错误的,但在实际的环境中却是正确的(在vs2012),有些读者认为是书刊的笔误,应该是
d.j,如紫色部分。
对正确与否暂且不论,这个例子对我们更好的理解前面的三句话有很大的帮助。逐一理解:
第一句:(1)友元关系不能继承。
这句话包含了两层含义,我们来举两个现实中的情节说明。
1)张三结交甚广,对朋友更是慷慨至极,生前有一些财产,在没被儿子继承前,通过设定friend,让发小李四共享,现在张三的儿子继承了
张三的财产A,加上自己的勤劳,又有了自己的新的一部分财产B,某天,李四要访问张三与其共享的财产,张三的儿子不允许(书上标示为error的部分), 李四很生气,暴脾气上来连抽了张三儿子几个耳光,愤愤道:“娘的老子又没用你的,老子用的是你老子的。” 张三的儿子无奈,只能心中一万匹草泥马掠过。谁知又过了几天,李四又要打张三儿子财产B的注意,张三儿子那个乐啊,pia pia 还了几个耳光,欣然道:“这是老子自己的,去你nnd。”
故事告一段落,以书中的例子作为解说,第一句的意思是Base与Frnd的友元关系没有被D1继承,所以除了D1从Base继承的部分,Frnd是不能访问的, 除非张三的儿子很尊 敬这个叔叔,显式的与李四建立friend关系。即第二句所言。
2)李四的儿子继承了老爹,成功上位,李四这老爷子走之前告诉儿子说你张三叔那还有部分他俩共享的财产,要儿子时常照看,没事去转转,别被张三儿子独吞了,李四儿子喜极,放下马褂径直奔去,结果被张三儿子家的下人一顿暴打,更被张三儿子辱骂一番:娘的,比你爹还没出息,你老子来也就算了,你算什么东西,我老子当年跟你有friend契约吗?李四儿子灰脸泪奔而去。
故事结束,以书中的例子解说,D2继承了Frnd,但Frnd和Base的friend关系是他们那代人的关系,是不能被继承的,是断代的。即第三句所言。
第二句中的“派生类的成员”,指派生类独有的,非从父类继承的部分。
第三句在故事中讲清楚了。
最后,学习知识是严肃、严谨的事情,若发现其中理解偏差或错误的部分,请不吝赐教,拜谢。(csdn编辑真不太好用)