当前位置:  开发笔记 > 编程语言 > 正文

类vtable如何跨共享库工作?

如何解决《类vtable如何跨共享库工作?》经验,为你挑选了1个好方法。

假设我有一个名为的共享库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();

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

    应用程序崩溃

    Plugin::doMoreStuff()调用该方法

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



1> harmic..:

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

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

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

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

...

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

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

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有