8

我可以将纯虚拟函数(在基类中)更改为非纯函数,而不会遇到任何二进制兼容性问题吗?(Linux, GCC 4.1)

谢谢

4

2 回答 2

4

当您从纯切换到然后重新编译代码时,没有兼容性问题。(但是,纯粹可能会导致问题。)virtualvirtualvirtualvirtual

您唯一应该注意的是,非纯virtual方法必须有一个主体。它们不能保持未实现。IE

class A {
public:
  virtual int foo ()
  {
    return 0; //put some content
  }
};

你不能简单地说,

virtual int foo();

即使您不使用它,它也会导致链接器错误。

于 2011-07-19T14:36:01.120 回答
3

保持二进制兼容性对您意味着什么?

对象布局将是相同的,但除非您重新编译所有代码,否则您将违反单一定义规则,此时二进制兼容性基本上是无用的。如果不重新编译,ODR 就会被破坏,虽然它可能会工作,但也可能无法工作。

特别是如果类中的所有虚方法都是纯的或内联定义的,那么编译器可能会在每个包含标头的翻译单元中生成 vtable 并将其标记为弱符号。然后链接器将选择其中一个并丢弃所有其他。在这种情况下,链接器不需要验证所有 vtable 是否完全相同,并且会随机选择一个(或以未定义的方式确定性地),并且它可能会选择一个这样的 vtable,其中该方法是纯虚拟的,在如果在基类的对象上调用该方法,turn 可能最终导致应用程序崩溃。

于 2011-07-19T16:31:00.037 回答