友元类与友元函数的继承与传递问题

C++ Primer中有如下描述:友元关系不能被继承,基类的友元对派生类没有特殊的访问权限。

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

    注:有待通过g++编译器来验证。验证也是全部通过。


1 友元类的继承问题

1.1一个友元类的派生类,可以通过其基类接口去访问设置其基类为友元类的类的私有成员,也就是说一个类的友元类的派生类,某种意义上还是其友元类,这句话有点绕,上代码就清晰了

示例代码:

[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.一个派生类的基类的友元类仍然是它的友元类

示例代码如下

[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.   
  12. class C:public A     //通过继承,A的友员类B成了派生类C的友员类   
  13. {   
  14. public:   
  15.     C(int x):A(x){}   
  16. };  
  17.   
  18. class B   
  19. {  
  20. public:   
  21.     void fun(A& ob) { cout <<ob.a << endl; }   
  22.     void fun2(C& ob) { cout << ob.a << endl; }   
  23. };   
  24.   
  25. void main()   
  26. {   
  27.     C c(55);   
  28.     B b;   
  29.     b.fun(c);   
  30.     b.fun2(c);  
  31. }   


2 友元函数的继承问题

基类的友元函数仍然是派生类的友元函数

示例代码:

[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 void fun(B&); //若注释掉此句则无法通过编译  
  10.     virtual ~A(){} //用作基类的类皆添加一个虚析构函数是一个好习惯,无论析构函数是否真的需要  
  11. };   
  12.   
  13. class B: public A  
  14. {  
  15. public:  
  16.     B(int x): A(x) {}  
  17. };  
  18.   
  19. void fun(B& o)  
  20. {  
  21.     cout << o.a << endl;  
  22. }  
  23.   
  24. void   main()   
  25. {   
  26.     //A a(55);  
  27.     B b(66);  
  28.     //fun(a);  
  29.     fun(b);  
  30. }   



3 友元类的传递问题

一个友元类B的友元类,对将B设置为友元类的类没有特殊的访问权限

示例代码如下:

[cpp]  view plain  copy
  1. #include <iostream>   
  2. using namespace   std;   
  3. class A   
  4. {   
  5.     int a;   
  6. public:   
  7.     A(int x=0) { a=x; }   
  8.     friend class B;   
  9. };   
  10.   
  11. class B   
  12. {   
  13. public:   
  14.     void fun(A& ob) { cout << ob.a << endl; }  
  15.     friend class C;  
  16. };  
  17.   
  18. class C  
  19. {  
  20. public:  
  21.     void fun(A& ob) { cout << ob.a << endl; } //此句无法通过编译  
  22. };  
  23.   
  24. void   main()   
  25. { }   



4 友元函数的传递问题

一个友元类的友元函数对设置这个类为友元类的类没有特殊访问权限

示例代码如下:

[cpp]  view plain  copy
  1. #include <iostream>   
  2. using namespace   std;   
  3. class A   
  4. {   
  5.     int a;   
  6. public:   
  7.     A(int x=0) { a=x; }   
  8.     friend class B;   
  9. };   
  10.   
  11. class B   
  12. {   
  13. public:   
  14.     void fun(A& ob){ cout << ob.a << endl;}   
  15.     friend void fun2(A& ob);  
  16. };   
  17.   
  18. void fun2(A& ob)  
  19. {   cout << ob.a << endl; //此句无法通过编译   
  20. }  
  21.   
  22. void   main()   
  23. { }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值