ホームページ >バックエンド開発 >C++ >私の派生クラスが C の基本クラスのコンストラクターを継承しないのはなぜですか?

私の派生クラスが C の基本クラスのコンストラクターを継承しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-21 07:35:10523ブラウズ

Why Doesn't My Derived Class Inherit My Base Class's Constructor in C  ?

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

コンストラクターが期待どおりに継承されない場合、困惑することがあります。次のコード スニペットを考えてみましょう:

class A<br>{</p>
<pre class="brush:php;toolbar:false">public: 
    explicit A(int x) {}

};

class B: public A
{
};

int main(void)
{

B *b = new B(5);
delete b;

}

このコードはコンパイル エラーを生成します:

main.cpp:13: error: no matching function for call to ‘B::B(int)’
main.cpp:8: note: candidates are: B::B()
main.cpp:8: note:                 B::B(const B&)

予期せず、クラスB はクラスからコンストラクターを継承しませんA.

ソリューションの公開

C 03 では、コンストラクターは自動的に継承されませんでした。コンストラクターを継承するには、派生クラスのコンストラクターから手動で呼び出す必要がありました。ただし、C 11 の コンストラクター継承 では、この制限が緩和されました。

コンストラクター継承の利用

C 11 では、using キーワードを使用すると継承が可能になります。基本クラスのすべてのコンストラクターの。これを行うには、次の行を派生クラスに追加するだけです:

using A::A; // Inherits all constructors from class A

この手法を使用すると、基本クラスのすべてのコンストラクターが派生クラスに継承されます。

例外処理

派生クラスが手動でコンストラクターを定義する場合、そのクラスはコンストラクターを継承しないことに注意することが重要です。基本クラス。このような場合、すべてのコンストラクターを手動で定義し、必要に応じて基本クラスのコンストラクターを明示的に呼び出す必要があります。

テンプレート化された基本クラス

テンプレート化された基本クラスの場合、同様のアプローチが次のようになります。雇用されている。テンプレート化された基本クラスから派生クラスにすべてのコンストラクターを継承するには、次の構文を使用します。

using vector<T>::vector; /// Takes all vector's constructors

このアプローチにより、基本クラスのすべてのコンストラクターが派生クラスに確実に継承されます。

以上が私の派生クラスが C の基本クラスのコンストラクターを継承しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。