【发布时间】:2017-11-10 16:58:48
【问题描述】:
我正在阅读有关 dynamic_cast 的内容,然后我遇到了以下语句 (from cplusplus.com):
兼容性说明:这种类型的 dynamic_cast 需要 Run-Time Type 用于跟踪动态类型的信息 (RTTI)。一些编译器 支持此功能作为默认禁用的选项。这 需要使用 dynamic_cast 启用运行时类型检查 与这些类型一起正常工作。
例子之后:
// dynamic_cast
#include <iostream>
#include <exception>
using namespace std;
class Base { virtual void dummy() {} };
class Derived: public Base { int a; };
int main () {
try {
Base * pba = new Derived;
Base * pbb = new Base;
Derived * pd;
pd = dynamic_cast<Derived*>(pba);
if (pd==0) cout << "Null pointer on first type-cast.\n";
pd = dynamic_cast<Derived*>(pbb);
if (pd==0) cout << "Null pointer on second type-cast.\n";
} catch (exception& e) {cout << "Exception: " << e.what();}
return 0;
}
作者所说的“这种类型的dynamic_cast”是什么意思? dynamic_cast 不是仅用于多态类(几乎)吗?他提到这个 RTTI 是动态转换工作所必需的,这是否意味着您必须谨慎使用 dynamic_cast,因为您不知道编译器是否完全支持它,因此它比其他转换更具风险不需要这个 RTTI 的算子?
【问题讨论】:
-
您应该对 cplusplus.com 所说的一切持保留态度。例如,我不知道有任何 C++ 编译器默认禁用 RTTI。
-
如果您为 C++ 禁用 RTTI,您要么有一个非常 充分的理由并且真的 知道您在做什么,并且有分析来支持您的声明这很重要。要么;你是一个白痴。顺便说一句,停止阅读 cplusplus.com 并改为阅读 cppreference.com 和其他好的资源。
-
@NeilButterworth 我可以想象一个非常有限的嵌入式系统的编译器可能会认为 RTTI 开销太大,默认情况下将其关闭,但我已经多年没有在该领域工作了也没遇到过。
-
这几乎是重复的:stackoverflow.com/questions/2253168/… 和来自那里的链接
-
无论如何,如果您禁用 RTTI,例如通过使用-fno-rtti,我想你会在使用动态转换时遇到编译器错误(至少我明白了)。所以我认为它是“保存”,因为我认为它不会在禁用 RTTI 的情况下编译。
标签: c++ casting dynamic-cast