1.多态和动态绑定:
动态绑定:在C++中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定。
多态:多态性可以简单地概括为“一个接口,多种方法”
多态目的:为了接口重用。对于动态多态来说就是不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。
多态类型:
a、编译时多态性:通过模板或者重载函数实现(子类实现父类中的同名函数,但是接口不一样称为覆盖(override),或者称为重写)
b、运行时多态性:通过虚函数实现
棱形继承的解决方法,虚继承:是通过在虚基类A的直接派生类(B和C)里面放一个指针去指向这个虚基类A。(A的儿子的儿子D,则没有这个指针)
2. RTTI(运行期类型识别)
- RTTI 只支持多态类,也就是说没有定义虚函数是的类是不能进行 RTTI的。
- 对指针进行
dynamic_cast
失败会返回NULL ,而对引用的话,识别会抛出bad_cast exception
。 - typeid 可以返回
const type_info&
,用以获取类型信息。 - 当typeid作用于指针时,返回的结果是该指针静态编译时类型
即 base *a=new deriveed; typeid(a);结果是 base * 指向base的指针
关于1是因为RTTI的实现是通过vptr来获取存储在虚函数表中的type_info*
,事实上为非多态类提供RTTI,也没有多大意义。 2的原因在于指针可以被赋值为0,以表示 no object,但是引用不行。关于3,虽然第一点指出RTTI只支持多态类,但typeid
和type_info
同样可用于内建类型及所有非多态类。与多态类的差别在于,非多态类的type_info
对象是静态取得(所以不能叫“执行期类型识别”),而多态类的是在执行期获得。
3. RAII(以对象管理资源)
简单说就是实现一个类来帮助我们获取资源,管理资源,释放资源。
具体实现就是把资源作为一个类的数据成员,然后在类的析构函数中释放资源,免得我们写代码的时候忘记释放资源。