将纯虚拟更改为虚拟并保持二进制兼容

时间:2011-07-19 14:33:53

标签: c++ binary-compatibility pure-virtual

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

感谢

2 个答案:

答案 0 :(得分:4)

从纯virtual切换到virtual然后重新编译代码时,无兼容性问题。 (但是,virtual到纯virtual可能会导致问题。)

唯一需要注意的是,非纯virtual方法必须有一个正文。它们不能保持未实现。即。

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

你不能简单地说,

virtual int foo();

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

答案 1 :(得分:3)

维护二进制兼容性对您来说意味着什么?

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

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