任何人都可以用几个术语解释 DYNAMIC_CLASSes 吗?

Posted

技术标签:

【中文标题】任何人都可以用几个术语解释 DYNAMIC_CLASSes 吗?【英文标题】:Can anyone explain the DYNAMIC_CLASSes in a few terms? 【发布时间】:2013-03-04 00:09:24 【问题描述】:

我已经开发了一段时间。这些野兽不时出现在 MFC、wxWidgets 代码中,但我找不到任何关于它们具体做什么的信息。

据我了解,它们出现在 dynamic_cast 集成到核心 C++ 之前。其目的是允许动态创建对象和运行时动态转换。

但这就是我找到的所有信息的终点。

我遇到了一些在 DLL 中使用 DECLARE_DYNAMIC_CLASS 和 IMPLEMENT_DYNAMIC_CLASS 的示例代码,这些代码用于导出的类。这种结构让我很困惑。

为什么会这样?这是一种基于插件的方法,您调用 LoadLibrary 然后调用 CreateDynamicClass 来获取可以转换为所需类型的指针?

DECLARE/IMPLEMENT_DYNAMIC 是否在 DLL 边界上工作?由于偶类对于 DLLEXPORT 来说并不那么安全,这里我们除了现有的问题外,还有一个自定义的 RTTI 表。

是否可以从另一个 DLL 的 DYNAMIC_CLASS 派生我的类,它是如何工作的?

谁能解释一下这些东西的用途,或者我可以在哪里找到关于一个主题的两个以上的句子

【问题讨论】:

您可能会发现这个答案很有用:***.com/questions/14318993/… 【参考方案1】:

这些东西为你的类附加了额外的类型信息,它允许以独立于运行时的方式进行 RTTI,让工厂可以创建你的类和许多其他东西。您可以在 COM、QMetaObject 等处找到类似的方法

【讨论】:

它是否与跨模块方法混合使用?如果对象在一个模块中声明,并在另一个模块中使用?类型查找表一般存放在哪里? 正如docs.wxwidgets.org/trunk/overview_rtti.html 中所说,它存储为静态wxClassInfo 实例的链表。跨模块边界使用它是安全的。但是使用这些类的安全性取决于它们的跨模块安全性,就像在 COM 中一样。 QueryInterfacedynamic_cast 的 COM 模拟,但如果你的接口使用像 std::vector 这样的类(内存布局可能在 Debug/Release/Runtime 版本中有所不同),它们的使用是不安全的【参考方案2】:

您是否查看过 DECLARE/IMPLEMENT_DYNAMIC 的定义?

在 MS 世界中,所有大写字母通常表示宏,因此您只需查找定义并尝试从那里弄清楚它在做什么。如果您在 Visual Studio 中,您可以点击一个键来跳转到定义 - 看看它说了什么,然后查找并尝试从那里开始工作。

【讨论】:

以上是关于任何人都可以用几个术语解释 DYNAMIC_CLASSes 吗?的主要内容,如果未能解决你的问题,请参考以下文章

任何人都可以用外行术语解释,当使用域名打开我的网站时,它显示 https,但使用静态 IP,它显示 http。为啥?

如何使用 RVM 更新 Ruby 解释器?

Lightroom中几个重要名词术语的解释

几个并发的术语解释——QPS,TPS,PV

01.数仓常见概念术语

Vim高级入门功能:你会用几个?