这是我学习基于Linux C++做的笔记!
运行期型式信息RTTI
RTTI
- 运行期间表示对象的型式信息
- 优势:允许使用指向基类的指针或引用自如地操纵派生类对象
- typeid:获取表达式的类型;type_info:型式信息类;
- 头文件:“typeinfo”
对象转型模板
dynamic_cast:动态转型(类类型指针或引用的转型)
static_cast:静态转型
reinterpret_cast:复诠转型
const_cast:常亮转型
type_info类
- 编译器实现的动态形式信息类型;
- 用于在程序运行时保存数据对象的形式信息;
- 不能直接使用该类,只能通过typeid操作符;
- 调用成员函数name(),可以获得类的名称;
typeid操作符
#include<typeinfo>
Programmer p;//类
Employee &e=p;//类
cout<<typeid(e).name()<<endl;//输出p实际类名的字符串 “Programmer”
dynamic_cast三种方式
- 向上转型
- 向下转型
- 交叉转型:沿着类多重继承层次横向转型
指针的动态转型
- 正确执行:指向目标类对象
- 错误:结果为0/NULL(C++11:nullptr)
引用的动态转型
- 正确执行:目标类对象的引用
- 错误:引发bad_cast异常
static_cast
- 与dynamic_cast不同,static_cast不仅可以用于指针和引用,还可用于其他类型
- 一般用于非类型式的普通数据对象转型
static_cast的问题
- 不进行运行期型式检查,不安全
- 若转型失败结果未定义
const_cast
- 用于取消和设置量的const状态
const_cast的问题
class ConstCastTest{
public:
void PrintNum() const;
private:
int _num;
}
void ConstCastTest::PrintNum() const{//传进来常量指针this,指向当前类对象
//临时将指向常量对象指针转换为非常量
const_cast<ConstCastTest*>(this)->num--;
cout<<_num<<endl;
}
reinterpret_cast
- 将任意型式的数据对象转型为目标型式
- 可用于int与指针型的互换
reinterpret_cast的问题
- 由程序员保证正确性
- 64位系统和32位系统,之间的转型可能会出错