类型转换是C/C++中重要的一种转换,对于内置类型的转换,其往往伴随着精度丢失或者转换失败。
而对于继承体系中的类类型转换,可分为两大类别:
- 向上转换:将派生类的指针引用转换为基类的指针或引用,根据里式替换规则,这类转换是安全的。
- 向下转换:将基类的指针引用转换为派生类的指针或引用,由于不确定基类指针实际指向,所以这类转换是不安全的。
C++实现多态的核心是虚函数,其一种通俗的描述是:通过基类指针引用指向不同的子类,而采取统一地调用方法,虚函数机制能够确保根据实际的指向对象不同调用相应的函数。
关于类型转换,C++中提供两种转换实现:
static_cast:静态类型转换,在编译器完成类型转换的语法检查,针对向上转换,其是安全的,但对于向下转换,其无法确保安全性
dynamic_cast:运行期类型转换,其会在运行期检查基类指针和引用是否实际指向相应的待转换类型。即检查向下转换的安全性。
具体dynamic_cast如何在运行期检查实际的指向类型?
其通过运行期类型检查的功能,也就是RTTI 其只能用在含有虚函数的机制体系中
具体做法是通过Vptr访问到虚函数表,而虚函数表中头部存放着指向类型信息结构体的指针
通过该指针访问到类型信息结构体,由此确定实际类型。
因此,支持RTTI以及虚函数,就需要额外的空间和时间开销。
大量使用dynamic_cast造成性能下降,在确定实际类型时使用static_cast将更加高效。