第15章
protected成员: 具有protected访问控制级别的成员是半公开的,外界无法直接访问这个控制级别的成员,但是派生类的base指针(在c++中也可用引用访问)可以获得访问能力。protected与private基本相似,只有在继承时有较大的区别。继承的类可以访问protected成员,但是不能访问private成员。
派生类到基类转换的可访问性(p489)转自http://www.2cto.com/kf/201403/283389.html
在看C++ primer中的关于派生类到基类转换的可访问性的问题时,对于以下:
- 如果是public继承,则用户代码和后代码类都可以使用派生类到基类的转换。如果类是使用private或protected继承派生的,则用户代码不能将派生类型对象转换为基类对象。如果是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可以相同。