-3

我在 C++/ATL(活动模板库)中有一个旧的 COM 组件,它使用 dynamic_cast 将 COM 接口转换为实现该接口的 C++ 类。

如果无法进行转换,则 dynamic_cast 返回一个 NULL 指针。

我现在在一个可见的 C# 组件中实现了同一个 COM 接口的新实现。

当从 C# 将 dynamic_cast 运算符应用于 COM 对象时,我希望它返回 NULL,但实际上它会引发异常(我不知道是什么异常)。

我当然可以将 dynamic_cast 包装在 try/catch 块中,但这是正常行为吗?

4

1 回答 1

0

我认为 MGetz 给出了正确的信息。

dynamic_cast 依赖于运行时类型信息 (RTTI)。这意味着它只能在所有代码都使用相同的编译器(使用相同的编译器选项)编译的同构项目中工作。

如果我禁用 RTTI,我会得到

warning C4541: 'dynamic_cast' used on polymorphic type 'IMyInterfaceName' with /GR-; 
unpredictable behavior may result

实际上,我们可以将其扩展为 C# 对象的 COM 可调用包装器 (CCW) 上的 dynamic_cast 也会导致不可预测的行为。

最好完全避免 dynamic_cast 。

于 2017-02-01T07:50:19.487 回答