友元类与继承

http://blog.csdn.net/shandianling/article/details/7469361

C++ Primer中有如下描述:友元关系不能继承。基类的友元对派生类的成员没有特殊访问
权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。

 然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述相悖,却符合VS编译器的处理规则。

注:有待通过g++编译器来验证。

1 友元类的继承问题

1.1 A类的友元B的派生类C 不能访问A类的private或protect成员变量。但可以通过B提供的接口来访问A。(废话肯定可以)

[cpp]  view plain copy
  1. #include <iostream>   
  2. using namespace   std;   
  3. class B;   
  4. class A   
  5. {   
  6.     int a;   
  7. public:   
  8.     A(int x=0) { a=x; }   
  9.     friend class B;   
  10. };   
  11. class B   
  12. {   
  13.     int b;   
  14. public:   
  15.     void fun(A& ob){ cout << ob.a << endl;}   
  16. };   
  17.   
  18. class C:public B  
  19. {   
  20. public:   
  21.     //void fun2(A& ob){ cout <<ob.a <<endl;}   //派生类新加的函数却不能访问A,此句会报错  
  22. };   
  23.   
  24. void   main()   
  25. {   
  26.     A a(55);   
  27.     C c;   
  28.     c.fun(a); //C是B的派生类   通过基类B的函数fun仍然可以访问   
  29. }   


1.2.  Base的友元可以通过Base的派生类Drived访问Base的private,protect成员变量,但不能访问Drived的private,protect成员变量。(这一点似乎与《C++ primer》里说的有点冲突)

个人理解:Drived的对象本身就包含Base,Base的友元Frnd自然就可以访问Base的部分。

[cpp]  view plain copy
  1. #include <iostream>   
  2. using namespace std;   
  3. class Base   
  4. {   
  5.     int m_a;   
  6. public:   
  7.     Base(int x=0){ m_a=x; }   
  8.     friend class Frnd;   
  9. };   
  10.   
  11. class Drived:public Base   
  12. {   
  13. private:  
  14.     int m_c;  
  15. public:   
  16.     Drived(int x):Base(x){m_c=x;}   
  17. };  
  18.   
  19. class Frnd   
  20. {  
  21. public:   
  22.     void fun(Base& ob) { cout <<ob.m_a << endl; }   
  23.     void fun2(Drived& ob)   
  24.     {  
  25.         cout << ob.m_a<<endl;  
  26.         //cout <<ob.m_c<<endl; //编译错误  
  27.     }   
  28. };   
  29.   
  30. int main()   
  31. {   
  32.     Drived d(1);   
  33.     Frnd f;   
  34.     f.fun(d);   
  35.     f.fun2(d);  
  36.     system("pause");  
  37.     return 0;  
  38. }   

3 友元类的传递问题

A的友元是B,B的友元是C,那A的友元是C? 不是,友元类不具有传递性。


相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页