クラス宣言の最後に仮想関数を追加すると、バイナリの非互換性が回避される理由を誰かに説明してもらえますか?
私が持っている場合:
class A
{
public:
virtual ~A();
virtual void someFuncA() = 0;
virtual void someFuncB() = 0;
virtual void other1() = 0;
private:
int someVal;
};
その後、このクラス宣言を次のように変更します。
class A
{
public:
virtual ~A();
virtual void someFuncA() = 0;
virtual void someFuncB() = 0;
virtual void someFuncC() = 0;
virtual void other1() = 0;
private:
int someVal;
};
前の宣言に対してコンパイルされた別の .so からコアダンプを取得します。しかし、クラス宣言の最後 (「int someVal」の後) に someFuncC() を配置すると、次のようになります。
class A
{
public:
virtual ~A();
virtual void someFuncA() = 0;
virtual void someFuncB() = 0;
virtual void other1() = 0;
private:
int someVal;
public:
virtual void someFuncC() = 0;
};
コアダンプが表示されなくなりました。誰かがこれがなぜなのか教えてもらえますか? そして、このトリックは常に機能しますか?
PS。コンパイラは gcc ですが、これは他のコンパイラで動作しますか?