提供されたコード スニペットでは、クラス B のオブジェクトを B *b = new で初期化しようとするとエラーが発生します。基本クラス A にコンストラクターが存在するにもかかわらず、B(5); これにより、なぜこのクラスでは継承されたコンストラクターにアクセスできないのかという疑問が生じます。 case.
この問題を理解する鍵は、 C のコンストラクター継承の複雑なルールにあります。明示的なコンストラクターの継承がない場合、派生クラスは基本クラスからコンストラクターを自動的に継承しません。これは C 03 規格の場合でした。コンストラクターの継承を実現するには、次の修正されたコードに見られるように、派生クラスは using キーワードを明示的に使用する必要があります:
class A { public: explicit A(int x) {} }; class B: public A { using A::A; };
using A::A; の追加により、クラス B はコンストラクターを次から継承します。クラス A、エラーを解決します。この継承は基本クラス内のすべてのコンストラクターに適用され、派生クラスは特定のコンストラクターのみを選択的に継承できないことに注意することが重要です。
コンパイラーが C 11 標準をサポートしている場合は、コンストラクターの using キーワードを利用できます。継承。ただし、C 03 標準では、コンストラクターはデフォルトでは継承されず、基本コンストラクターを呼び出して派生クラスに手動で実装する必要がありました。
テンプレート化された基本クラスの場合、 using キーワードを使用して、この例で示すように、コンストラクターを継承します:
template<class T> class my_vector : public vector<T> { public: using vector<T>::vector; ///Takes all vector's constructors /* */ };
以上が派生クラスが C のコンストラクターを継承しないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。