文章预览:
- 一. RTTI是什么
- 二. dynamic_cast类型(指针/引用)转换
- 2.1 C风格的强制类型转换
- 2.2 指针转换(常见用法)
- 2.3 引用转换
- 三. typeid运算符
- 四. type_info类
- 五. RTTI与虚函数表
一. RTTI是什么
RTTI(Run-Time Type Identification):通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
前面我们提过父类指针可以new一个子类对象:
Human* phuman = new Man; Human &a = *phuman; // *phuman表示指针phuman所指向的对象
如果父类Human有多个子类,那么通过RTTI可以在系统运行时知道,父类
Human指针
phuman到底指向其哪个子类的对象。
RTTI我们可以把这个程序看成是一种系统提供给我们的一种能力,或者一种功能。这种功能或者能力是通过2个运算符来体现:
-
dynamic_cast运算符:能够将基类的指针或者引用安全的转换为派生类的指针或者引用。 应用:因为父类指针
phuman无法调用子类
Man对象成员,可以使用
dynamic_cast将父类
Human指针转换成子类
Man指针。
-
typeid运算符:返回指针或者引用所指对象的实际类型。
补充*:想让RTTI两个运算符能够过正常工作,基类中必须至少要有一个virtual虚函数,不然这两个运算符工作的结构就可能跟我们预期不一致。因为只有虚函数的存在,这两个运算符才会使用指针或者引用所绑定的对象的动态类型。
class Human { public: virtual void print() { cout << "This is 人类" << endl; } }; class Man :public Human { public: virtual void print() { cout << "This is 男人" << endl; } }; int main() { Human * phuman = new Men; phuman->print(); system("pause"); return 0; }
这里的printMan并不是虚函数,通过
dynamic_cast将基类指针转换成了子类指针从而完成的对子类成员函数的调用。
注意:使用dynamic_cast转换,父类中必须要有虚函数的存在,否则会报错: