gpt4 book ai didi

c++ - 禁用 RTTI 的 dynamic_cast

转载 作者:IT老高 更新时间:2023-10-28 21:35:53 28 4
gpt4 key购买 nike

我很想知道在禁用 RTTI 的情况下使用动态转换编译代码时会发生什么(在 GCC 上使用 -fno-rtti 或在 Visual Studio 上使用 /GR-)。编译器是否“回退”到 static_cast ?由于(至少在 VS 上)它只会发出警告,所以编译后的代码会做什么?

更具体地说,如果我在没有 RTTI 的情况下编译我确信 dynamic_cast 不会出错的代码(即 dynamic_cast 可以安全地替换为 static_cast) 喜欢这个:

class A{ /*...*/ } ;
class B : public A {
int foo() { return 42 ;}
} ;
//...
A * myA = new B() ;
int bar = (dynamic_cast<B*>(myA))->foo() ;

最佳答案

阅读标准,在 5.2.7/6 中我们发现除非目标是源的明确基础,否则源必须是多态类型。然后在 10.3/1

Virtual functions support dynamic binding and objectoriented programming. A class that declares or inherits a virtual function is called a polymorphic class.

换句话说,标准似乎没有说明您的问题。在这种情况下,标准不允许编译器关闭 RTTI,因此对于每个编译器,您需要检查其文档以查看会发生什么。基于此阅读,我认为这是一个编译器问题,而不是标签所示的 C++ 语言问题。

或者,您可以在知道足够的情况下使用 static_cast 来完全避免该问题。

关于c++ - 禁用 RTTI 的 dynamic_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687041/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com