8

バイナリ互換性の問題が発生することなく、純粋仮想関数(基本クラス内)を非純粋になるように変更できますか?(Linux、GCC 4.1)

ありがとう

4

2 に答える 2

4

純粋からに切り替えてからコードを再コンパイルする場合、互換性の問題はありません。(ただし、純粋にすると問題が発生する可能性があります。)virtualvirtualvirtualvirtual

あなたが注意しなければならない唯一のことは、非純粋なvirtual方法は体を持たなければならないということです。それらは実装されないままにすることはできません。すなわち

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

簡単に言うことはできません、

virtual int foo();

使用しなくてもリンカーエラーが発生します。

于 2011-07-19T14:36:01.120 に答える
3

バイナリ互換性を維持するとはどういう意味ですか?

オブジェクトのレイアウトは同じですが、すべてのコードを再コンパイルしない限り、単一定義規則に違反することになります。再コンパイルすると、バイナリ互換性は基本的に役に立たなくなります。再コンパイルしないと、ODRが壊れ、動作する場合もありますが、動作しない場合もあります。

特に、クラス内のすべての仮想メソッドが純粋であるかインラインで定義されている場合、コンパイラはヘッダーを含む各変換ユニットでvtableを生成し、それを弱いシンボルとしてマークする可能性があります。次に、リンカはそれらの1つを選択し、他のすべてを破棄します。この状況では、リンカはすべてのvtableが完全に同じであり、ランダムに(または決定論的に未定義の方法で)1つを選択することを確認する必要はありません。また、メソッドが純粋な仮想であるようなvtableを1つ選択する場合があります。基本クラスのオブジェクトでメソッドが呼び出された場合、turnはアプリケーションをクラッシュさせる可能性があります。

于 2011-07-19T16:31:00.037 に答える