C++ Primer中有如下描述:友元关系不能被继承,基类的友元对派生类没有特殊的访问权限。
然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述相悖,却符合VS编译器的处理规则。
注:有待通过g++编译器来验证。验证也是全部通过。
1 友元类的继承问题
1.1一个友元类的派生类,可以通过其基类接口去访问设置其基类为友元类的类的私有成员,也就是说一个类的友元类的派生类,某种意义上还是其友元类,这句话有点绕,上代码就清晰了
示例代码:
- #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仍然可以访问
- }
示例代码如下:
- #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 友元函数的继承问题
基类的友元函数仍然是派生类的友元函数
示例代码:
- #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设置为友元类的类没有特殊的访问权限
示例代码如下:
- #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 友元函数的传递问题
一个友元类的友元函数对设置这个类为友元类的类没有特殊访问权限
示例代码如下:
- #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()
- { }