类vtable如何跨共享库工作?

Nat*_*man 3 c++ virtual-functions vtable one-definition-rule

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

class Plugin
{
    public:
        virtual void doStuff();
};
Run Code Online (Sandbox Code Playgroud)

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

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

Plugin *createSpecialPlugin()
{
    return new SpecialPlugin;
}
Run Code Online (Sandbox Code Playgroud)

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

virtual void doMoreStuff();
Run Code Online (Sandbox Code Playgroud)

重新编译libspecialplugin.

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

Plugin *plugin = createSpecialPlugin();
plugin->doMoreStuff();
Run Code Online (Sandbox Code Playgroud)

我猜是发生以下其中一种情况:

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

libspecialplugin库是否包含libplugin可用于确定哪些方法被覆盖的信息 - 即使在运行时也是如此?我对这应该发生的事情有点模糊.

har*_*mic 7

通过Plugin在使用这两个库的任何程序中的两个不同的转换单元中使用相同的类()定义,您实际上违反了"一个定义规则" .

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

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

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

...

你的类Plugin有两个不同的定义,一个是libplugin,另一个是libspecialplugin,所以它不符合标准.

标准没有定义结果,所以任何事情都可能发生.