3

仮想を含む他の変更が派生クラスで行われた場合でも、クラスのビューの ABI は安定したままですか?

つまり、インターフェイスInterfaceA(多くの純粋仮想関数を持つ抽象クラス) とDerivedBそれを継承するクラスがあるとします。を取る関数を持つライブラリを作成しますInterfaceA *。私が知りたいのは、インターフェイス自体が変更されない限り、インターフェイスがバイナリ互換性を維持しているかどうかです。

明らかに、変更した場合InterfaceA、コードがバイナリ互換であることは期待できません。ただし、単に変更するとどうなるでしょうかDerivedB。つまり、さらにインターフェイスを継承したり、他の仮想関数を追加したりします。極端な言い方をすると、 を定義する別のクラスから多重継承しますInterfaceAInterfaceAこれらすべての変更にもかかわらず、バイナリ互換性は維持されますか?

今までの私の仮定と経験は、互換性があるということです。これの確認(または互換性がない場合は反論)を探しているだけです。

注: 動的型付けやその他のキャストについては気にしません。インターフェイス関数自体についてのみ気にします。

また、注意: 使用されているコンパイラのバージョンは、全体として ABI が安定していると想定してください。メジャー バージョンの変更はありません。

4

2 に答える 2

3

はい、InterfaceAの仮想関数の名前、引数、および順序が変更されない限り、バイナリ互換性は維持されます。これにより、クラス宣言の最後に関数を追加できることに注意してください。

(これはC ++仕様によって明示的に保証されていない可能性がありますが、COMはこれに依存しているため、大きなC ++コンパイラーはこのように動作します。)

于 2011-09-13T08:40:48.057 に答える