【发布时间】:2011-10-08 14:25:41
【问题描述】:
我可以将纯虚拟函数(在基类中)更改为非纯函数,而不会遇到任何二进制兼容性问题吗? (Linux、GCC 4.1)
谢谢
【问题讨论】:
标签: c++ binary-compatibility pure-virtual
我可以将纯虚拟函数(在基类中)更改为非纯函数,而不会遇到任何二进制兼容性问题吗? (Linux、GCC 4.1)
谢谢
【问题讨论】:
标签: c++ binary-compatibility pure-virtual
当您从纯virtual 切换到virtual 然后重新编译代码时,没有兼容性问题。 (但是,virtual 到纯 virtual 可能会导致问题。)
唯一需要注意的是,非纯 virtual 方法必须有一个主体。它们不能保持未实现。即
class A {
public:
virtual int foo ()
{
return 0; //put some content
}
};
你不能简单地说,
virtual int foo();
即使你不使用它也会导致链接器错误。
【讨论】:
保持二进制兼容性对您意味着什么?
对象布局将是相同的,但您将违反单一定义规则除非您重新编译所有代码,此时二进制兼容性基本上是无用的。如果不重新编译,ODR 就会被破坏,虽然它可能会工作,但也可能无法工作。
特别是如果类中的所有虚方法都是纯的或内联定义的,那么编译器可能会在每个包含标头的翻译单元中生成 vtable 并将其标记为弱符号。然后链接器将选择其中一个并丢弃所有其他。在这种情况下,链接器不需要验证所有 vtable 是否完全相同,并且会随机选择一个(或以未定义的方式确定性地),并且它可能会选择一个这样的 vtable,其中该方法是纯虚拟的,在如果在基类的对象上调用该方法,turn 可能最终导致应用程序崩溃。
【讨论】: