コンストラクターの継承: 謎
コンストラクターが期待どおりに継承されない場合、困惑することがあります。次のコード スニペットを考えてみましょう:
class A<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><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 サイトの他の関連記事を参照してください。