gpt4 book ai didi

c++ - 类 vtable 如何跨共享库工作?

转载 作者:太空狗 更新时间:2023-10-29 20:10:09 24 4
gpt4 key购买 nike

假设我有一个名为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 段):

There can be more than one definition of a class type (Clause 9) ... in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then:

  • each definition of D shall consist of the same sequence of tokens; and

...

您的 Plugin 类有两种不同的定义,一种被烘焙到 libplugin 中,另一种被烘焙到 libspecialplugin 中,因此它不符合标准。

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

关于c++ - 类 vtable 如何跨共享库工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41583524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com