友元类与继承
来源:互联网 发布:java初学者书籍 编辑:程序博客网 时间:2024/06/03 23:07
C++ Primer中有如下描述:友元关系不能继承。基类的友元对派生类的成员没有特殊访问
权限。如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。
然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述相悖,却符合VS编译器的处理规则。
注:有待通过g++编译器来验证。
1 友元类的继承问题
1.1 A类的友元B的派生类C 不能访问A类的private或protect成员变量。但可以通过B提供的接口来访问A。(废话肯定可以)
#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. Base的友元可以通过Base的派生类Drived访问Base的private,protect成员变量,但不能访问Drived的private,protect成员变量。(这一点似乎与《C++ primer》里说的有点冲突)
个人理解:Drived的对象本身就包含Base,Base的友元Frnd自然就可以访问Base的部分。
#include <iostream> using namespace std; class Base { int m_a; public: Base(int x=0){ m_a=x; } friend class Frnd; }; class Drived:public Base { private:int m_c;public: Drived(int x):Base(x){m_c=x;} };class Frnd {public: void fun(Base& ob) { cout <<ob.m_a << endl; } void fun2(Drived& ob) {cout << ob.m_a<<endl;//cout <<ob.m_c<<endl; //编译错误} }; int main() { Drived d(1); Frnd f; f.fun(d); f.fun2(d);system("pause");return 0;}
3 友元类的传递问题
A的友元是B,B的友元是C,那A的友元是C? 不是,友元类不具有传递性。
- 友元类与继承
- 友元类与继承
- 继承与菱形继承
- 继承与虚继承
- 继承与虚继承
- 继承*菱形继承与菱形虚拟继承
- 11 继承,多重继承与虚继承
- 类继承与接口继承
- 多重继承与虚继承
- 多重继承与虚继承
- 多重继承与虚继承
- 接口继承与实现继承
- 单一继承与多重继承
- 多重继承与虚继承
- 多重继承与虚继承
- 接口继承与实现继承
- 多继承与虚继承
- 接口继承与实现继承
- 批处理修改host文件方法
- 你在亲密关系里找什么
- 第九周实验报告4
- Android Intent 用法汇总
- oracle常用优化
- 友元类与继承
- 使用call为对象添加回调函数
- Java编程提高性能时需注意的地方
- va_list、va_start、va_arg、va_end
- 2012年第15周国内Android应用下载排名
- HDU 1029 出现次数最多(不解)
- 日语单词怎么背
- java下Class.forName的作用是什么,为什么要使用它
- sql 类+连接sql server 2005