类vtable如何在共享库中工作?

内森·奥斯曼(Nathan Osman)

假设我有一个名为的共享库libplugin在此共享库中,有一个类:

class Plugin
{
    public:
        virtual void doStuff();
};

我们还要假设还有另一个名为的共享库libspecialplugin它包含以下类和函数:

class SpecialPlugin : public Plugin
{
    public:
        virtual void doStuff();
};

Plugin *createSpecialPlugin()
{
    return new SpecialPlugin;
}

现在,假设我更改Plugin并添加以下方法:

virtual void doMoreStuff();

重新编译libspecialplugin

当我这样做时会发生什么:

Plugin *plugin = createSpecialPlugin();
plugin->doMoreStuff();

我猜发生了以下情况之一:

  1. 应用程序崩溃
  2. Plugin::doMoreStuff()方法被调用

libspecialplugin是否包含libplugin可用于确定重写哪些方法的信息-即使在运行时?我对这里到底应该发生什么感到有些模糊。

有害的

通过Plugin在使用两个库的任何程序中,在两个不同的翻译单元中以不同的方式定义相同的类(),可以有效地违反“一个定义规则”

该标准说(C ++ 11 ISO 14882:2011,§3.2第5段):

如果每个定义出现在不同的翻译单元中,并且定义满足以下要求,则程序中可以有一个以上的类类型定义(第9条)。给定一个在多个翻译单元中定义的名为D的实体,则:

  • D的每个定义应由相同的令牌序列组成;

...

您的类Plugin有两个不同的定义,一个定义放入libplugin,另一个定义在libspecialplugin中,因此不符合该标准。

该结果未由标准定义,因此任何事情都可能发生。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章