mr *_*mpy 8 c++ pure-virtual binary-compatibility
我是否可以将纯虚函数(在基类中)更改为非纯函数而不会遇到任何二进制兼容性问题?(Linux,GCC 4.1)
谢谢
保持二进制兼容性对您来说意味着什么?
对象布局将是相同的,但除非重新编译所有代码,否则您将违反“单一定义规则”,此时二进制兼容性基本上毫无用处。如果不重新编译,ODR 就会被破坏,虽然它可能可以工作,但也可能无法工作。
特别是,如果类中的所有虚拟方法都是纯方法或内联定义的,则编译器可能会在包含标头的每个翻译单元中生成 vtable,并将其标记为弱符号。然后链接器将选择其中之一并丢弃所有其他。在这种情况下,链接器不需要验证所有 vtable 是否完全相同,并且会随机选择一个(或以未定义的方式确定性地),并且它可能会选择一个这样的 vtable,其中该方法是纯虚拟的,这在如果在基类的对象上调用该方法,turn 可能最终导致应用程序崩溃。