Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates typeid、动态转换(向上转换)和模板_Templates_Dynamic Cast_Typeid - Fatal编程技术网

Templates typeid、动态转换(向上转换)和模板

Templates typeid、动态转换(向上转换)和模板,templates,dynamic-cast,typeid,Templates,Dynamic Cast,Typeid,关于动态转换、typeid()和模板,我没有什么问题 1) 为什么typeid不需要RTTI 2) 多态类型上的动态\u强制转换: 当我使用RTTI编译过程进行向下转换(从基到派生)时 当RTTI关闭时-我收到一条警告(警告C4541:“dynamic_cast”用于多态类型“CBase”和/GR-;可能导致不可预测的行为) 当我执行向上转换(派生到基)时,无论是否使用RTTI,编译都会顺利进行 我不明白的是,为什么当我向上投射时,RTTI是关闭的——我没有收到任何警告/错误 3) 非多态类

关于动态转换、typeid()和模板,我没有什么问题

1) 为什么typeid不需要RTTI

2) 多态类型上的动态\u强制转换:

  • 当我使用RTTI编译过程进行向下转换(从基到派生)时

    当RTTI关闭时-我收到一条警告(警告C4541:“dynamic_cast”用于多态类型“CBase”和/GR-;可能导致不可预测的行为)

  • 当我执行向上转换(派生到基)时,无论是否使用RTTI,编译都会顺利进行
我不明白的是,为什么当我向上投射时,RTTI是关闭的——我没有收到任何警告/错误

3) 非多态类型上的动态\u强制转换:

  • 当我在有或没有RTTI的情况下进行向下转换时,编译失败(错误C2683:“dynamic_cast”:“CBase”不是多态类型)
但是

  • 当我使用RTTI或不使用RTTI进行向上转换时,编译过程会顺利进行
为什么非多态类型上的向上转换不带RTTI

4) 模板函数前面的“内联”是否有任何影响,即当编译器编译该函数并看到它是“内联”时,它实际上会将该函数视为内联函数,或者忽略它

非常感谢你的帮助 David

1)它确实需要RTTI。至少如果你在多态类上使用它…这才是它真正的目的

2) 如果动态_cast上没有RTTI,则无法检查您正在强制转换的对象是否确实是要强制转换的对象类型。这就是动态_cast(本质上)和静态_cast之间的区别。静态_cast不会检查这一点,因此不太“安全”,但速度更快。因此,如果您没有RTTI,当您向下播放时,它无法进行动态播放

向上转换是安全的,因为您可以在编译时确定类型,因此您可以使用dynamic_cast向上转换到基类

3) dynamic_cast downcasting适用于polymorhpic类型(例如其中包含虚拟函数的类型),因此,如果类不是多态的,它将无法工作。因此,如果CBase没有虚拟函数,就不能使用动态强制转换

与2的向上投射原因相同

我想你应该读一读不同的演员是为了什么

4) 是的,它将编译为内联