C は、継承の概念をサポートするオブジェクト指向プログラミング言語です。実際の開発では、継承ツリーに最終派生クラスが複数存在し、構文エラーが発生する状況に遭遇します。この記事では、この状況について説明し、解決策を提供します。
最終的な派生クラスは何ですか?
まず、継承ツリー内の最終的な派生クラスが何であるかを理解する必要があります。最終派生クラスは、他のクラスが継承しないクラスであり、リーフ クラスとも呼ばれます。例:
class Animal { public: virtual void move() = 0; }; class Mammal : public Animal { public: void eat(); }; class Reptile : public Animal { public: void crawl(); }; class Dog : public Mammal { public: void bark(); }; class Snake : public Reptile { public: void hiss(); };
上記のコードでは、Dog
と Snake
は、他のクラスがこれらを継承しないため、最終的な派生クラスになります。
最終的な派生クラスが複数存在するのはいつですか?
最終派生クラスを複数定義すると構文エラーが発生します。たとえば、新しいリーフ クラス Cat
:
class Cat : public Mammal, public Reptile { public: void meow(); };
を定義すると、コンパイル時に次のエラーが表示されます:
error: ambiguous base class ‘Cat::Mammal’ error: ambiguous base class ‘Cat::Reptile’
これは、Cat
が原因です。同時に 2 つのクラス Mammal
と Reptile
を継承し、Mammal
と Reptile
は両方とも Animal
を継承しました。これにより、コンパイラは、Cat
が継承する Animal
クラスの一意のコピーを判断できなくなります。このとき、コンパイル中にあいまいさエラーが発生します。
解決策
上記の問題を解決するには 2 つの方法があります:
Cat
クラスの場合、これが最良の方法です。曖昧さを避けるために、複数の最終派生クラスから継承する代わりに、1 つの最終派生クラスから継承させます。たとえば、Cat
クラスに Mammal
クラスを継承させて、Reptile
クラスのすべてのメソッドを Cat## に実装することができます。 #。
class Cat : public Mammal { public: void meow(); void crawl(); };
キーワードを追加することで、共有基本クラス インスタンスが 1 つだけ存在するようにすることを意味します。たとえば、
class Mammal : virtual public Animal { public: void eat(); }; class Reptile : virtual public Animal { public: void crawl(); }; class Cat : public Mammal, public Reptile { public: void meow(); void crawl(); };
Mammal と
Reptile が
Animal を仮想的に継承できるようにします。 # Cat
には Animal
オブジェクトが 1 つだけ存在し、継承が繰り返される問題は解決されます。 要約すると、継承ツリーに複数の最終派生クラスがある場合、複数の最終派生クラスから同時に継承することを避けるか、仮想継承を使用することで、曖昧さの問題を解決できます。
以上がC++ 構文エラー: 継承ツリーに複数の最終派生クラスがあります。これを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。