1、多重继承
重载解析的使用不会跨越不同类的作用域。
使用声明可以将不同类中的函数引入到一个公共的作用域。在一个类定义里的使用声明所引用的必须是基类的成员。
在任何派生类中的virtual基类总用同一个(共享)对象表示。
虚基类的构造函数将在其派生类的构造函数之前调用。
多重继承能使兄弟类之间共享信息。
在覆盖虚基类的函数的时候,必须有一个函数覆盖所有其他的函数。
2、访问控制
protected是描述供派生类使用的操作的极好方式。
对于基类的访问描述符控制着对基类成员的访问,以及从派生类类型到基类类型的指针和引用转换。考虑从基类B派生出的类D:
- 如果B是private基类,那么它的public和protected成员只能由D的成员函数和友元访问。只有D 的成员和友元能将D*转换到B*。
- 如果B是protected基类,那么它的public和protected成员只能由D的成员函数和友元,以及由D派生的类的成员函数和友元访问。只有D 的成员和友元以及由D派生出的类的成员和友元能将D*转换的B*。
- 如果B是public基类,那么它的public成员可以由任何函数访问,它的protected成员能由D的成员函数和友元,以及D 的派生类的成员函数和友元访问。任何函数都能将D*转换到B*.
3、运行时类型信息
dynamic_cast<>()运算符有两个参数,一个是<>括起来的类型,另一个是()括起来的指针或者引用。
dynamic_cast要求一个到多态类型的指针或者引用,以便做向下强制或交叉强制。目标类型不必是多态的,可以将一个具体类型包裹在一个多态类型里。
dynamic_cast能从多态性的虚基类强制到某个派生类或者兄弟类,static_cast不检查被强制的对象,所以它做不到这样。
一个类对象并不简单是一块存储。类对象是通过其构造函数从“原始存储”中构筑起来的,并通过其析构函数的执行使它重归于“原始存储”。构造是自下而上的过程,析构是自上而下。一个类对象也就是在它能得以构造或析构的意义上才称其为对象。
通过typeid运算符可以知道一个类的名字或者它的布局。
4、指向成员的指针
指向成员的指针就是一种标识类成员的值。
5、自由存储
基类添加虚析构函数,保证清理。
定义一个函数,由它调用构造函数并返回构造起来的对象,可以构造一个对象而不必知道其确切的类型。