假设我有一个名为的共享库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
可用于确定重写哪些方法的信息-即使在运行时?我对这里到底应该发生什么感到有些模糊。
通过Plugin
在使用两个库的任何程序中,在两个不同的翻译单元中以不同的方式定义相同的类(),可以有效地违反“一个定义规则” 。
该标准说(C ++ 11 ISO 14882:2011,§3.2第5段):
如果每个定义出现在不同的翻译单元中,并且定义满足以下要求,则程序中可以有一个以上的类类型定义(第9条)。给定一个在多个翻译单元中定义的名为D的实体,则:
- D的每个定义应由相同的令牌序列组成;和
...
您的类Plugin
有两个不同的定义,一个定义放入libplugin,另一个定义在libspecialplugin中,因此不符合该标准。
该结果未由标准定义,因此任何事情都可能发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句