我是否可以将纯虚函数(在基类中)更改为非纯函数而不会遇到任何二进制兼容性问题? (Linux,GCC 4.1)
感谢
答案 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,其中该方法是纯虚拟的,其中如果在基类的对象上调用该方法,则转向可能会导致应用程序崩溃。