C++ 多态和RTTI

静态多态和动态多态的区别:
    静态多态:函数的相互重载,在编译期实现多态,属于早绑定。如:rect.calc(10) 和 rect.calc(10,20),在编译期间已经决定了选择运行哪个函数。编译器多态,一般通过模板的方式实现,即:在编译期间,编译器推断出模板参数,以此来确定模板函数使用哪个类对象的方法。
 动态多态:以封装类和继承类为基础,基类定义虚函数接口,派生类重写虚函数接口,以实现派生类特有的具体功能,最后运行期实现多态,通过虚函数表和虚函数表指针确定具体实现哪个虚函数。
  ⑴当某个类声明了虚函数时,编译器将为该类对象安插一个虚函数表指针,并为该类设置一张唯一的虚函数表,虚函数表中存放的是该类虚函数地址。运行期间通过虚函数表指针与虚函数表去确定该类虚函数的真正实现。
  ⑵虚函数绑定提高了程序运行的开销,并且虚函数无法优化。虚表指针增大了对象的体积要付出一定的资源消耗。
  ⑶要用虚函数来实现运行期多态,就必须有虚析构函数:防止使用基类指针释放派生类对象时,造成内存泄露。定义虚析构函数后,虚函数表会生成析构函数的指针。
  ⑷虚函数表不仅在基类产生,在派生类中也会生成:先通过虚函数表指针找到自己的虚函数表,再找到相应虚函数的函数入口地址 (函数指针) 进行调用。
  ⑸虚函数表指针位于:类对象的内存空间的前四个字节。若为抽象类的纯虚函数,则存储的值为0。
  ⑹抽象基类一般用于做为接口类(只有纯虚函数并且不含有数据成员的类),=0的纯虚函数不用写定义。
 
RTTI:
   运行时类型识别,通过运行时类型信息能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。用法:
        if( typeid(*A) == typeid(类名B) )
             typeid(类对象).name()       //显示当前类对象的类名   
 
 static_cast和dynamic_cast:
  static_cast<>(),用于在编译期进行类型转换,主要是C++中内置基本数据类型之间的相互转换。其在编译期就检查转换是否成功。
     dynamic_cast<派生类指针>(基类指针),用于在运行期进行类型转换,只能用于指针和引用的转换。一般用于基类的指针转换成派生类指针。其中转换的基类必须有虚函数,转换成功返回派生类地址,转换失败则返回NULL。 其在运行期才检查转换是否成功。
原文地址:https://www.cnblogs.com/ladawn/p/8185465.html