您的位置:首页 > 编程语言 > C语言/C++

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

2016-06-04 16:00 423 查看
C++ Primer中有如下描述:友元关系不能被继承,基类的友元对派生类没有特殊的访问权限。

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

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

1 友元类的继承问题

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

示例代码:

[cpp] view
plain copy

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

示例代码如下:

[cpp] view
plain copy

#include <iostream>   

using namespace std;   

class B;   

class A   

{   

    int a;   

public:   

    A(int x=0){ a=x; }   

    friend class B;   

};   

  

class C:public A     //通过继承,A的友员类B成了派生类C的友员类   

{   

public:   

    C(int x):A(x){}   

};  

  

class B   

{  

public:   

    void fun(A& ob) { cout <<ob.a << endl; }   

    void fun2(C& ob) { cout << ob.a << endl; }   

};   

  

void main()   

{   

    C c(55);   

    B b;   

    b.fun(c);   

    b.fun2(c);  

}   

2 友元函数的继承问题

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

示例代码:

[cpp] view
plain copy

#include <iostream>   

using namespace   std;    

class B;  

class A   

{   

    int a;   

public:   

    A(int x=0) { a=x; }   

    friend void fun(B&); //若注释掉此句则无法通过编译  

    virtual ~A(){} //用作基类的类皆添加一个虚析构函数是一个好习惯,无论析构函数是否真的需要  

};   

  

class B: public A  

{  

public:  

    B(int x): A(x) {}  

};  

  

void fun(B& o)  

{  

    cout << o.a << endl;  

}  

  

void   main()   

{   

    //A a(55);  

    B b(66);  

    //fun(a);  

    fun(b);  

}   

3 友元类的传递问题

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

示例代码如下:

[cpp] view
plain copy

#include <iostream>   

using namespace   std;   

class A   

{   

    int a;   

public:   

    A(int x=0) { a=x; }   

    friend class B;   

};   

  

class B   

{   

public:   

    void fun(A& ob) { cout << ob.a << endl; }  

    friend class C;  

};  

  

class C  

{  

public:  

    void fun(A& ob) { cout << ob.a << endl; } //此句无法通过编译  

};  

  

void   main()   

{ }   

4 友元函数的传递问题

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

示例代码如下:

[cpp] view
plain copy

#include <iostream>   

using namespace   std;   

class A   

{   

    int a;   

public:   

    A(int x=0) { a=x; }   

    friend class B;   

};   

  

class B   

{   

public:   

    void fun(A& ob){ cout << ob.a << endl;}   

    friend void fun2(A& ob);  

};   

  

void fun2(A& ob)  

{   cout << ob.a << endl; //此句无法通过编译   

}  

  

void   main()   

{ }   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c++ primer class