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