1.继承和动态绑定在两个方面简化了我们的程序
能够容易地定义与其他类相似但又不相同的新类,能够更容易地编写忽略这些相似类型之间区别的程序 P471
2.之所以称通过继承而相关联的类型为多态类型,是因为在许多情况下可以互换地使用派生类型或基类类型的“许多形态”,在C++ 中,多态性仅用于通过继承而相关联的类型的引用或指针 P472
3.基类必须指出希望派生类重定义哪些函数,定义为 virtual 的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数 P472
4.通过动态绑定我们能够编写程序使用继承层次中任意类型的对象,无需关心对象的具体类型,使用这些类的程序无需区分函数是在基类还是在派生类中定义的 P473
5.通过基类的引用(或指针)调用虚函数时,发生动态绑定,引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键,用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的 P473
6.除了构造函数外,任意非 static 成员函数都可以是虚函数,保留字 virtual 只在类内部的成员函数声明中出现,不能在类定义体外部出现的函数定义上 P474
7.像 public 成员一样,protected 成员可以被派生类对象访问;像 private 成员一样, protected 成员不能被类的用户访问;派生类只能通过派生类对象访问其基类的 protected 成员,派生类对其基类类型对象的 protected 成员没有特殊访问权限 P475
8.被继承的类必须决定实现的哪些部分声明为 protected 而哪些部分声明为 private ,希望禁止派生类访问的成员应该设为 private ,提供派生类实现所需操作或数据的成员应设为 protected ,提供给派生类型的接口是 protected 成员和 public 成员的组合 P479
9.因为每个派生类对象都包含基类部分,所以可将基类类型的引用绑定到派生类对象的基类部分,也可以用指向基类的指针指向派生类对象 P479
double print_total(const Item_base&, size_t); Item_base item; print_total(item, 10); Item_base *p = &item; Bulk_item bulk; print_total(bulk, 10); p = &bulk;
10.将基类类型的引用或指针绑定到派生类对象对基类没有任何影响,对象本身不会有任何改变,仍为派生类对象,对象的实际类型可能不同于该对象引用或指针的静态类型,这是C++ 动态绑定的关键 P480
11.派生类虚函数调用基类版本时,必须显式使用作用域操作符,如果派生类函数忽略了这样做,则函数调用会在运行时确定并且将是一个自身调用,从而导致无穷递归 P481
12.无论派生列表中是什么访问标号,所有继承 Base 的类对 Base 中的成员具有相同的访问,派生访问标号将控制派生类的用户对从 Base 继承而来的成员的访问 P483
13.友元关系不能继承,基类的友元对派生类的成员没有特殊访问权限,如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类 486
14.将派生类对象转化为基类类型引用,将对象传递给希望接受引用的函数时,引用直接绑定到该对象,虽然看起来在传递对象,实际上实参是对该对象的引用,对象本身未被复制,并且,转换不会在任何方面改变派生类型对象,该对象仍是派生类型对象;用派生类对象对基类对象进行初始化或赋值,将派生类对象传递给希望接收基类类型对象(而不是引用)的函数时,该派生类类型对象的基类部分被复制到实参 P488
15.一个类只能初始化自己的直接基类,直接基类就是在派生列表中指定的类,派生类应通过使用基类构造函数尊重基类的初始化意图,而不是在派生类构造函数函数体中对这些成员赋值 P492
16.重构包括重新定义类层次,将操作和/或数据从一个类移到另一个类,为了适应应用程序的需要而重新设计类以便增加新函数或处理其他改变时,最有可能进行重构 P492