ポリモーフィズムで少し遊んでいるとき、私は次のようなことをしようとしました:
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
つまり、継承順序を変更すると、このテーブルの添え字が変更されますか?!何か案は?