c++ - 禁用 RTTI 的 dynamic_cast

标签 c++ rtti dynamic-cast

我很想知道在禁用 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/

相关文章:

c++ - 如何找到反射顶点和凸顶点

c++ - QTreeWidget 中的 QT 可点击小部件(可能是按钮)?

c++ - 获取 C++ RTTI 作为 switch 语句中调度的枚举

c++ - 将引用包装器的 vector 转换为基类,将引用包装器的 vector 转换为派生类,不能动态转换

C++ 删除 base 或 dynamic_cast 指针?

c++ - 当您使用多重继承时,静态转换何时安全?

c++ - 返回的对象失去属性

c++ - 使用 std::thread 或 CreateThread()?

delphi - 如何正确使用 TRttiMethod.Invoke 中的字符串作为参数?

delphi - Delphi 中对象的 RTTI