C++ 的强制类型转换( 二 )


虽然继承类可以通过虚函数的方式一定程度上解决此种情况,但是,如果某个成员函数不是基类虚函数,而只存在于继承类中呢?dynamic_cast为我们提供了解决方案 。
当一个静态类型为基类指针或引用的变量确实存放了继承类指针或引用时,从基类向继承类的类型转换,即向下类型转换理论上是可行的,dynamic_cast即用于在运行时实现向下类型转换 。
需要注意的是,dynamic_cast的使用必须同时满足以下所有条件:

  1. 被转换的变量的类型为基类指针或引用,且其确实存放了一个继承类指针或引用
  2. 基类具有虚表,即基类必须至少定义了一个虚函数
参考以下代码:
struct A { virtual void test {} }; // 基类含有虚函数struct B: A { void test2 {} }; // 继承类特有函数int main{// 静态类型为基类指针的变量存放继承类指针A *b = new B;// 通过向下类型转换调用继承类特有函数dynamic_cast<B *>(b)->test2;}上述代码中,我们首先定义了具有虚函数的基类A,然后定义了具有继承类特有函数的类B 。此时,由于test2成员函数并未在基类中注册为虚函数,我们将无法通过静态类型为A *的变量b调用此函数 。但由于我们可以确定变量b的动态类型为B *,则可以于运行时通过dynamic_cast将变量b的静态类型转为B *,然后调用继承类的特有函数test2 。
5.reinterpret_cast
reinterpret,即“重新解释”,顾名思义,这个强制类型转换的作用是提供某个变量在底层数据上的重新解释 。当我们对一个变量使用reinterpretcast后,编译器将无视任何不合理行为,强行将被转换变量的内存数据重解释为某个新的类型 。需要注意的是,reinterpretcast要求转换前后的类型所占用内存大小一致,否则将引发编译时错误 。
参考以下代码:
int main{reinterpret_cast<int *>(0); // 强行将一个整数的内存数据解释为一个int *}6.讨论
编程语言的强类型与弱类型相关话题,多年来业界一直讨论不休,有的语言发展出了高度弱类型的语法体系,而有的语言则相对严谨,要求用户尽可能多的使用显式类型转换 。C++作为一门经典的弱类型语言,其类型转换的相关话题自然十分庞大 。
纵观C++的类型转换语法体系,其延续了C++一贯的包罗万象风格,不仅为用户提供了自定义类型转换的极大自由度,也在语法层面为类型转换可能会带来的各种错综复杂的情况作出了严谨的规定 。
保守看来,如果对C++的类型转换没有深入的理解,或不希望大量使用隐式类型转换时,我们不应过度的依赖诸如非explicit转换构造函数,自定义的类型转换操作符,以及涉及隐式类型转换的各种重载确定等语法组分 。但作为C++语法体系的一个重要部分,深入理解C++关于类型转换的各种话题,必定是十分重要的 。
作者简介:樱雨楼,毕业于生物信息学专业,是一枚Python/C++/Perl开发,自称R语言黑粉,GitHub勾搭:https://github.com/yingyulou

【C++ 的强制类型转换】


推荐阅读