友元类与友元函数的继承与传递问题
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()
{ }
然而通过实践发现,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++实现JNI接口需要注意的事项
- Android Native 绘图方法
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- C#中struct和class的区别详解
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法