c++对象模型--多态,运行时类型识别
虚函数机制
- 单一继承
单一继承下,类型包含虚函数时,每个class有一个virtual table,内含该class中有作用的virtual function的地址,然后每个class object有一个vptr,执向virtual table所在。
Point:
Point2d:
Point3d:
类型和虚表:
- 多重继承
Base1:
虚表:
标*的虚表槽内执行的执行路径会包含对应的指针处理,再引发对应的函数调用。
成员函数指针
普通成员函数指针(非静态,非虚拟)
得到的结果是它在内存中真正的地址执行虚拟成员函数指针
多重继承下,虚拟继承下
考虑场景更复杂。
一种可能采用的成员指针结构:
根据存储的不同成员函数特点,设置不同字段。翻译调用时,依据字段识别类型,出发相应场景下调用逻辑。
运行时类型识别
1.typeid
对类型或类型实例执行typeid返回一个type_info对象,用于描述类型。
type_info的相等操作符,和成员函数可用于运行时获取类型信息
2.dynamic_cast
实现基类指针转换到派生类指针时,转换失败,返回null。
实现基类引用转换到派生类引用时,转换失败,抛出异常。
