c++的知识难点收集

第15章

protected成员: 具有protected访问控制级别的成员是半公开的,外界无法直接访问这个控制级别的成员,但是派生类的base指针(在c++中也可用引用访问)可以获得访问能力。protected与private基本相似,只有在继承时有较大的区别。继承的类可以访问protected成员,但是不能访问private成员。

派生类到基类转换的可访问性(p489)转自http://www.2cto.com/kf/201403/283389.html

在看C++ primer中的关于派生类到基类转换的可访问性的问题时,对于以下:

  • 如果是public继承,则用户代码和后代码类都可以使用派生类到基类的转换。如果类是使用privateprotected继承派生的,则用户代码不能将派生类型对象转换为基类对象。如果是private继承,则从private继承类派生的类不能转换为基类。如果是protected继承,则后续派生类的成员可以转换为基类类型。  
  • 对比英文版:  
  • If the inheritance is public, then both user code and  member functions of subsequently derived classes may use   the derived-to-base conversion. If a class is derived   using private or protected inheritance, then user code   may not convert an object of derived type to a base type  object. If the inheritance is private, then classes   derived from the privately inherited class may not   convert to the base class. If the inheritance is   protected, then the members of subsequently derived   classes may convert to the base type.  
  • 这样就可以理解了。主要是因为访问级别的改变,导致了派生类到基类转换的可访问性的改变。
  • 现在我们要说明的问题有两个,一个是用户代码中访问的问题,一个是派生类中访问的问题。
  • (1)先说用户代码中访问的问题。
    B和A的关系有三种:
    1 B:public A
    2 B:proteced A
    3 B:private A


    针对这样一段代码:
    A a;
    B b;
    a = b;
    我们把它放在main.cpp中时,只有1是正确的,2,3都是错误的。这个说明的就是:只有当子类和基类的关系是public继承时,才能在用户代码中把子类赋给基类,其余两种都不行。


    (2) 后继派生类中访问的问题
    C和B的关系有三种
    1 C:public B
    2 C:proteced B
    3 C:private B
    但是不管C和B关系怎样,C中总是可以访问B的public和protected成员,现在假设C中有一个成员函数
    void C::func()
    {
    A a;
    B b;
    a = b;
    }
    此时当B和A的关系是public,protected继承的时候,函数func的这段代码都没有问题,因为A,B中的非private成员在C中都可以为访问,所以没有问题。但是当B和A的关系是private的时候,这段代码就出问题了,因为A在B中是私有成员,所以不能访问A,更不用说 a = b了。
  • C++ STL set和multiset的使用
    set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值