ホームページ > バックエンド開発 > C++ > 派生クラスが C のコンストラクターを継承しないのはなぜですか?それを修正するにはどうすればよいですか?

派生クラスが C のコンストラクターを継承しないのはなぜですか?それを修正するにはどうすればよいですか?

DDD
リリース: 2025-01-05 08:52:40
オリジナル
690 人が閲覧しました

Why Don't Derived Classes Inherit Constructors in C   and How Can We Fix It?

コンストラクターの継承: 継承の物語

提供されたコード スニペットでは、クラス 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート