友元关系与继承——《C++ primer》笔记,书中的小bug
2012-05-02 11:29
253 查看
友元关系,friendship不能继承,书中想表达的意思是这种friendship不能继承是双向的。
也就是说,自己朋友的儿子不能访问自己,朋友也不能访问自己的儿子,唯一的关联是朋友和自己
但是,书中的代码表达确实是有错误的,如果我的想法是错的,欢迎指正。。。。。。。。。。。。
测试代码如下:
也就是说,自己朋友的儿子不能访问自己,朋友也不能访问自己的儿子,唯一的关联是朋友和自己
但是,书中的代码表达确实是有错误的,如果我的想法是错的,欢迎指正。。。。。。。。。。。。
测试代码如下:
//派生类不能继承友元关系,双向的,既不能享受访问权力也不能被访问 #include<iostream> class Base{ friend class Frnd; protected: int i; }; //Frnd has no access to members in D1 class D1 : public Base{ protected: int j; }; class Frnd{ public: int mem(Base b) { return b.i; }//ok:Frnd is friend to Base int mem(D1 d) { return d.i; }//书上认为这个是错误的,描述是:friendship doesn't inherit //int mem(D1 d) { return d.j; }//事实是这个才是错误的,friendship是没inherit,但是i是派生类的基类部分 }; //D2 has no access to members in Base class D2 : public Frnd{//访问权限没继承来 public: //int mem(Base b) { return b.i; }//'int Base::i' is protected, }; int main(){ D1 d; Base *b = &d; D2 d2; Frnd *f1 = &d2; //打印一样,书上解释错了,访问d.i没错,d.j才是不能被访问的,说明friend关系确实没继承,但是派生类中的基类部分还是可以被访问的。 //打印值相同 std::cout << d2.mem(*b) << std::endl; std::cout << d2.mem(d) << std::endl; //上边的d2.mem()是从Frnd继承来的,说明继承来的基类部分也有访问Base的特权 //综合就是,虽然友元关系的双向都是不可继承的,但是继承过来的基类部分都保留有原权力 }friendship是不能继承,友元不能访问派生类,但是派生类中的基类部分确实开放访问的,对称的友元的派生类的基类部分,也保留着这个访问特权
相关文章推荐
- spring学习笔记(5)——bean的继承与依赖关系
- 友元关系与继承以及基类派生类定义构造函数时应该注意的事项
- C++ Primer 学习笔记_72_面向对象编程 -句柄类与继承[续]
- C++ Primer 学习笔记_96_用以大型程序的工具 -多重继承与虚继承[续1]
- C++ Primer 学习笔记 — 友元
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
- C++学习笔记46——友元与继承
- C++ Primer 学习笔记_67_面向对象编程 --转换与继承、复制控制与继承
- C++ Primer 学习笔记_97_用来大型程序的工具 -多重继承与虚继承[续2]
- c++ 友元关系与继承
- c++ primer 学习笔记:类之友元
- C++语法基础--恢复继承成员的访问级别,默认继承保护级别,友元关系与继承,继承与静态成员
- Hibernate学习笔记----映射继承关系
- C++ primer第二次阅读学习笔记(第17章:用于大型程序的工具:多重继承与虚继承) .
- Hibernate笔记=>继承关系的映射
- 友元关系的继承
- C++笔记: 继承,友元
- C++ Primer 学习笔记_53_类和数据抽象 --友元、static员
- 15、C++ Primer 4th 笔记,类和数据抽象,友元
- 二十五、继承(二) 不能自动继承的成员函数、继承与构造函数、友元关系与继承、静态成员与继承