http://blog.csdn.net/shandianling/article/details/7469361
C++ Primer中有如下描述:友元关系不能继承。基类的友元对派生类的成员没有特殊访问
权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。
然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述相悖,却符合VS编译器的处理规则。
注:有待通过g++编译器来验证。
1 友元类的继承问题
1.1 A类的友元B的派生类C 不能访问A类的private或protect成员变量。但可以通过B提供的接口来访问A。(废话肯定可以)
- #include <iostream>
- using namespace std;
- class B;
- class A
- {
- int a;
- public:
- A(int x=0) { a=x; }
- friend class B;
- };
- class B
- {
- int b;
- public:
- void fun(A& ob){ cout << ob.a << endl;}
- };
- class C:public B
- {
- public:
- //void fun2(A& ob){ cout <<ob.a <<endl;} //派生类新加的函数却不能访问A,此句会报错
- };
- void main()
- {
- A a(55);
- C c;
- c.fun(a); //C是B的派生类 通过基类B的函数fun仍然可以访问
- }
1.2. Base的友元可以通过Base的派生类Drived访问Base的private,protect成员变量,但不能访问Drived的private,protect成员变量。(这一点似乎与《C++ primer》里说的有点冲突)
个人理解:Drived的对象本身就包含Base,Base的友元Frnd自然就可以访问Base的部分。
- #include <iostream>
- using namespace std;
- class Base
- {
- int m_a;
- public:
- Base(int x=0){ m_a=x; }
- friend class Frnd;
- };
- class Drived:public Base
- {
- private:
- int m_c;
- public:
- Drived(int x):Base(x){m_c=x;}
- };
- class Frnd
- {
- public:
- void fun(Base& ob) { cout <<ob.m_a << endl; }
- void fun2(Drived& ob)
- {
- cout << ob.m_a<<endl;
- //cout <<ob.m_c<<endl; //编译错误
- }
- };
- int main()
- {
- Drived d(1);
- Frnd f;
- f.fun(d);
- f.fun2(d);
- system("pause");
- return 0;
- }
3 友元类的传递问题
A的友元是B,B的友元是C,那A的友元是C? 不是,友元类不具有传递性。