多态和动态绑定和RTTI(运行期类型识别)和RAII(以对象管理资源)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/speargod/article/details/100127395

1.多态和动态绑定:

动态绑定:在C++中,当我们使用基类的引用或指针调用一个虚函数时将发生动态绑定。

多态:多态性可以简单地概括为“一个接口,多种方法”

多态目的:为了接口重用。一个为了偷懒,少写点代码,还有就是用一点微弱的速度损失,节省内存(因为代码量少了),对于动态多态来说就是不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

多态类型 

                 a、编译时多态性:通过重载函数实现(子类实现父类中的同名函数,但是接口不一样称为覆盖(override),或者称为重写) 
                 b、运行时多态性:通过虚函数实现

 棱形继承:是通过在虚基类A的直接派生类(B和C)里面放一个指针去指向这个虚基类A。(A的儿子的儿子D,则没有这个指针)

2. RTTI(运行期类型识别)

  1. RTTI 只支持多态类,也就是说没有定义虚函数是的类是不能进行 RTTI的。
  2. 对指针进行dynamic_cast失败会返回NULL ,而对引用的话,识别会抛出bad_cast exception
  3. typeid 可以返回const type_info&,用以获取类型信息。
  4. 当typeid作用于指针时,返回的结果是该指针静态编译时类型

即  base *a=new deriveed; typeid(a);结果是 base *  指向base的指针

关于1是因为RTTI的实现是通过vptr来获取存储在虚函数表中的type_info* ,事实上为非多态类提供RTTI,也没有多大意义。 2的原因在于指针可以被赋值为0,以表示 no object,但是引用不行。关于3,虽然第一点指出RTTI只支持多态类,但typeidtype_info同样可用于内建类型及所有非多态类。与多态类的差别在于,非多态类的type_info对象是静态取得(所以不能叫“执行期类型识别”),而多态类的是在执行期获得。

3. RAII(以对象管理资源)

简单说就是实现一个类来帮助我们获取资源,管理资源,释放资源。

具体实现就是把资源作为一个类的数据成员,然后在类的析构函数中释放资源,免得我们写代码的时候忘记释放资源。

猜你喜欢

转载自blog.csdn.net/speargod/article/details/100127395