1、在继承情况下,派生类的作用域嵌套在基类作用域中。正是这种类作用域的层次嵌套使我们能够直接访问基类的成员。
2、与基类成员同名的派生类成员将屏蔽对基类成员的访问。可以使用作用域操作符访问被屏蔽的基类成员。
3、在基类和派生类中使用同一名字的成员函数,其行为与数据成员一样:在派生类作用域中派生类成员将屏蔽基类成员。即使函数原型不同,基类成员也会被屏蔽。
4、通过派生类对象调用基类对象时,实参必须与派生类中定义的版本相匹配,只有在派生类根本没有定义该函数时,才考虑基类函数。
如果派生类想通过自身类型使用所有的重载版本,则派生类必须要么重定义所有的版本,要么一个也不重定义。
可以通过using为基类成员函数名称进行声明,将所有该函数的重载实例都加到派生类的作用域中。
5、名字查找与继承
1)首先确定进行函数调用的对象、引用或指针的静态类型。
2)在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。
如果不能在类或其相关基类中找到该名字,则调用是错误的。
3)一旦找到了该名字,就进行常规类型检查,通过查看找到的定义,来检查该函数调用是否合法。
4)假定函数调用合法,编译器就生成代码。如果函数是虚函数且通过引用或指针调用,则编译器生成代码以确定根据对象的动态类型运行哪个函数版本,否则,编译器生成代码直接调用函数。
6、含有(或继承)一个或多个纯虚函数的类是抽象基类。除了作为抽象基类的派生类的对象的一部分,不能创建抽象类型的对象。
7、容器与继承
在容器中保存有继承关系的对象,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初始化)。
唯一的可行的选择是容器中保存对象的指针。但是需要用户管理对象和指针。C++中一个通用的技术是包装类(cover)或句柄类(handle)。用句柄类存储和管理类指针。
8、包装了继承层次的句柄有两个重要的设计考虑因素:
1)像对任何保存指针的类一样,必须确定对复制控件做些什么。包装了继承层次的句柄通常表现得像一个智能指针或者像一个值。
2)名柄类决定句柄接口屏蔽还是不屏蔽继承层次,如果不屏蔽继承层次,用户必须了解和使用基本层次中的对象(objects in the underlying hierarchy)。
句柄类经常需要在不知道对象的类型时分配已知对象的副本。解决这个问题的通用方法是定义虚操作进行复制,称该操作为clone,如示例中。
句柄类示例
<a href="http://files.cnblogs.com/mydomain/%E5%8F%A5%E6%9F%84%E7%B1%BB%E7%A4%BA%E4%BE%8B.rar">句柄类示例</a>
9、虚函数的重写中,派生类的返回类型必须与基类实例的返回类型完全匹配,但有一个例外:如果虚函数的基类实例返回类类型的引用或指针,则该虚函数的派生类实例可以返回基类实例返回的类型的派生类对象(或者是类类型的指针或引用)。
10、在定义关系运算符时,如定义==,<=时,其逻辑要一致。
参考
[1] multiset使用
<a href="http://blog.163.com/zhoumhan_0351/blog/static/399542272010396030501/">http://blog.163.com/zhoumhan_0351/blog/static/399542272010396030501/</a>