継承されたC ++ 11のコンストラクタ

https://en.cppreference.com/w/cpp/language/using_declaration

【における継承コンストラクタ ]このセクション。

実際には、「基底クラスのコンストラクタのフロントは」優れていると呼ばれています。

MYSTRINGのような文字列クラスから継承されたが、それでも文字列関数を提供します。新しい時間が静止画モードを渡すパラメータ古い初期設定を保持したいです。この時点ではと再び(基底クラスを呼び出す)でのMyStringを達成するために多くのトラブルです。

しかし、このことができる前にのみ、C ++ 11を。

(11または無関心C ++後)、C ++ 11の前にデフォルトのコンフィギュレーションモードでは、基本クラスの各々の上に最初のデフォルトの初期化関数の呼び出し。その後、フィールドはデフォルトの初期化でください導出されます。

C ++ユーザ定義のコンストラクタは、あなたが初期化リストで11の前に、基本クラスのコンストラクタを呼び出すことができ、およびパラメータを渡すことができます。基底クラスのコンストラクタは、まだ再び最初の呼び出しです。

11が始まっ++、C、ベース::ベースを使用していた、言葉遣い、コンパイラは、派生クラスで適切なコンストラクタを見つけることができないとき、あなたはこの基本クラスBaseにあります。その後、それはデフォルトコンストラクタ他の基本クラスを呼び出します、派生クラスのフィールドは、割り当てを初期化されます。(これは、11 C ++の後に導入されます)

 

継承コンストラクタ

場合using宣言は、(例えば、定義されたクラスの直接ベースのコンストラクタを意味ベース使用:: ベースを;)派生クラスを初期化するとき、そのベース(メンバアクセスを無視する)のすべてのコンストラクタは、オーバーロード解決に可視化されます。

それは無視される導入using宣言のアクセシビリティ:オーバーロード解決が継承されたコンストラクタを選択した場合、対応するベース・クラスのオブジェクトを構築するために使用されるときにアクセスできるならば、それがアクセス可能です。

もし継承コンストラクタのオーバーロード解決を選択する一つのこのような派生クラスのオブジェクトを初期化し、Baseコンストラクタが継承されたコンストラクタを使用して初期化されて継承されたサブオブジェクト、およびすべての他の塩基とのメンバーDerived不履行デフォルトコンストラクタによってかのように初期化されます(デフォルトメンバー初期化子が提供されている場合、それ以外の場合は、デフォルトの初期化が行われ使用されています)。全体の初期化は、単一の関数呼び出しとして扱われる:継承されたコンストラクタのパラメータの初期化は、配列決定の前に、派生オブジェクトの任意の塩基またはメンバーの初期化です。

 

翻訳はダウンし、おそらく次のとおりです。

ベース::ベースを使用して、使用することを:

>派生クラスの初期化、基底クラスのコンストラクタのオーバーロード解決のすべての可視、無視許可改質剤。

基底クラスのコンストラクタを選択した場合>、そしてその後、「その他の基本クラス」と「派生フィールドは、」デフォルトのデフォルトコンストラクタとして初期化され、基本クラスを初期化するためにそれを使用。(ユーザーがデフォルトの初期化を提供しない場合、提供されるデフォルトの初期化子を使用すると発生します)。

>基底クラスのコンストラクタは、常に呼び出すことが第一です。

ここでは、コードの例です。

構造体 B1 {B1(int型、...){}}。
構造体 B2 {B2(二重){}}。
 
int型 のget (); 
 
構造体D1:B1 {
   使用 B1 :: B1と、  // 継承B1(int型、...)
  int型のX;
  int型のy = GET (); 
}。
 
ボイド試験(){ 
  D1のD(234)。// OK:B1は、B1(2、3、4)を呼び出すことによって初期化され、
                  // その後DXあるデフォルト初期化、(何も初期化が行われない)
                  //その後、DYのget()を呼び出すことによって初期化された 
  D1 eを、          // エラー:D1は、デフォルトコンストラクタがありません
} 
 
構造体D2を:B2 {
   使用 B2を:: B2。// 継承B2(ダブル)
  B1のB; 
}。
 
D2 F(1.0)。       // エラー:B1にはデフォルトコンストラクタがありません
 
 

継承されたコンストラクタはのコンストラクタのいずれかの署名と一致した場合、他の非静的メンバ関数に使用して、宣言と同様に、Derivedバージョンがで見つかったことで、それは、ルックアップから隠されますDerived継承されたコンストラクタのいずれかが場合Baseのコピー/移動コンストラクタと一致するシグネチャを持つように起こるDerived、それは暗黙の発生防止しないDerived(その後に類似継承バージョンを、非表示にコピー/移動コンストラクタusing operator=)。

翻訳:簡単に言えば、ベースを使用して、次のとおりです。ベースの後、派生クラスは、バージョンが上書きすることをオーバーライドすることができます。この効果を使用せずに基本クラス/移動コンストラクタのコピー、派生クラス何のコピー/移動コンストラクタが存在しない場合、コンパイラはデフォルトを生成し、それが基本クラスを使用しません。

サンプルコード:

構造体 B1 {B1(INT )。}。
構造体 B2 {B2(INT )。}。
 
構造体D2:B1、B2 {
   使用B1 :: B1と、
  使用したB2 :: B2を。
  D2(INT)。   // OK:D2 :: D2(INT)皮両方B1 :: B1(INT)とB2 :: B2(INT)
}。
D2 D2(0)。    //はD2 :: D2(int)を呼び出し、

 

 

おすすめ

転載: www.cnblogs.com/xiang-yin/p/12075732.html