C コンパイル エラー: 同じ階層内で、仮想基本クラスが異なるシンボル テーブルに定義されています。これを変更するにはどうすればよいですか?
C プログラミングを使用すると、仮想基本クラスが同じ階層内の異なるシンボル テーブルに定義されているというエラーが発生することがあります。では、このエラーを解決するにはどうすればよいでしょうか?
まず、仮想基本クラスとは何かを理解しましょう。 C では、仮想基本クラスは継承された基本クラスを指します。このクラスは 1 回だけ継承され、継承関係で繰り返されません。主にダイヤモンド相続などの多重相続に起因する問題を解決するために使用されます。
次に、コードを見てみましょう:
class A{ public: A(int a):m_a(a){} int m_a; }; class B: virtual public A{ public: B(int b):A(b),m_b(b){} int m_b; }; class C: virtual public A{ public: C(int c):A(c),m_c(c){} int m_c; }; class D: public B,public C{ public: D(int b,int c,int d):A(0),B(b),C(c),m_d(d){} int m_d; };
上記のコードでは、クラス B とクラス C の両方が仮想継承を通じてオブジェクト A を継承する 4 つのクラスを定義しました。最後に、クラス D はクラス B とクラス C を継承します。この継承関係では、A は 1 回だけ継承され、仮想的な継承であることがわかります。これにより、ダイヤモンドの継承によって引き起こされる問題が回避され、A オブジェクトが 1 つだけ作成されるようになります。
ただし、上記のコードをコンパイルしようとすると、次のエラーが発生する可能性があります:
error: 'A' is an ambiguous base of 'D'
このエラー メッセージは、同じ階層内で異なるシンボル テーブルに定義されていることを示します。仮想基本クラス A。
したがって、この問題を解決するには、次の 2 つの方法があります:
A::
を使用して基底クラス A のスコープをそれぞれ指定し、異なるシンボル テーブルで仮想基底クラス A を定義する問題を回避します。修正したコードは次のとおりです。 class B: virtual public A{ public: B(int b):A(b),m_b(b){} int m_b; }; class C: virtual public A{ public: C(int c):A(c),m_c(c){} int m_c; }; class D: public B,public C{ public: D(int b,int c,int d):A(0),B(b),C(c),m_d(d){} int m_d; };
class B: virtual public A{ public: B(int b):A(b),m_b(b){} int m_b; }; class C: virtual public A{ public: C(int c):A(c),m_c(c){} int m_c; }; class D: virtual public B,virtual public C{ public: D(int b,int c,int d):A(0),B(b),C(c),m_d(d){} int m_d; };
スコープ インタープリタを使用するか仮想継承を使用するかに関係なく、同じ階層内の異なるシンボル テーブルに仮想基本クラスを定義するという問題を回避でき、コンパイルを解決できます。エラー。
つまり、仮想継承は C プログラミングで非常に一般的に使用されており、特に多重継承を扱う場合に、いくつかの問題を回避できます。しかし同時に、仮想継承によって引き起こされるいくつかの問題にも注意する必要があり、実際の使用においては、必要に応じて柔軟に使用し、適切な継承方法を選択する必要があります。
以上がC++ コンパイル エラー: 仮想基本クラスが同じ階層内の異なるシンボル テーブルに定義されています。これを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。