2

ポリモーフィズムで少し遊んでいるとき、私は次のようなことをしようとしました:

class a { virtual void method() { } };
class b { virtual void method() { } };
class c : public a, b {
    virtual void method() { }
    virtual void anotherMethod() { } // (1)
};
class d : public c, a, b // (2)
{ virtual void method() { } }; // C2369

私の知る限り、これは問題なく機能するはずです。しかし、コンパイラーは次のよう に述べています。error C2369: 'const d::'vftable'{for 'a'}' : redefinition; different subscripts そして、なぜこれが起こっているのか私にはわかりません。このエラーを解決するには、次の3つの方法があります。メソッド(1)を削除するか、継承の順序(2)を変更することができます。 編集:また、仮想継承を適用​​することでそれを解決できます。したがって、継承の順序またはマッピングがに影響を与えるように見えvftableます。これvftableは、仮想メンバー関数マッピングの配列です-別名。C++での動的バインディング。

そのため、 C2369に関するMicrosoftのドキュメントも見てきました。ここでは、これを例として示し、そのエラーを再現する方法を示しています。

int a[10];
int a[20];   // C2369
int b[20];   // OK

つまり、継承順序を変更すると、このテーブルの添え字が変更されますか?!何か案は?

4

1 に答える 1

0

クラスはデフォルトでプライベートに継承します(構造体とは対照的です)!したがって、「c」は「a」からのみ公に継承されます。そこに別の公開キーワードがありません:

class c : public a, public b

あなたが直面しているもう1つの問題は、同じメンバー関数を定義する2つのクラスから継承していることです。a::methodはb::methodと同じアドレスにマップされません!次の問題は、「メソッド」の呼び出しがあいまいであるということです。

于 2012-07-02T10:45:43.463 に答える