【发布时间】:2017-01-11 05:46:37
【问题描述】:
假设我有一个名为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 可以用来确定其哪些方法被覆盖的信息——即使在运行时也是如此?我对这里到底应该发生什么有点模糊。
【问题讨论】:
-
没有“共享库”之类的东西,这是一个矛盾。您所说的是共享对象代码,它的工作方式与常规对象代码一样,只是始终与位置无关(如今,常规对象代码通常与位置无关,但并不总是如此)。
标签: c++ vtable virtual-functions one-definition-rule