タイトルはほとんどそれをすべて言います-派生クラスは、親クラスから継承された関数/データメンバーの定義をヘッダーファイルに再インクルードする必要がありますか?
継承された関数/メンバーを継承ステートメントから暗示することはできますか? 読みやすくするために明示的に再宣言する必要がありますか、それとも隠れるリスクがありますか?
派生クラスのヘッダー ファイルで何をすべきかわかりません。
タイトルはほとんどそれをすべて言います-派生クラスは、親クラスから継承された関数/データメンバーの定義をヘッダーファイルに再インクルードする必要がありますか?
継承された関数/メンバーを継承ステートメントから暗示することはできますか? 読みやすくするために明示的に再宣言する必要がありますか、それとも隠れるリスクがありますか?
派生クラスのヘッダー ファイルで何をすべきかわかりません。
C++ 派生クラスは、継承された関数/メンバーの定義をヘッダー ファイルに含める必要がありますか?
非常に文字通りに解釈すると、いいえ - C++ では、非テンプレート関数の定義は、継承やクラス メンバーシップに関係なく、ヘッダーに表示される必要はありません。クラスは、静的データ メンバーのみを定義します (One Definition Rule に従って実装ファイルで)。基本クラスの定義は、派生クラスで繰り返す必要はなく、繰り返すこともできません。
そうは言っても、関数宣言について考えているに違いないと思います。
using
が、非表示の基本クラス関数を公開するステートメントが必要な場合がありますvirtual
があります(共変の戻り値の型に許可される非常に限られたバリエーションと、既定のパラメーターを変更する機能を使用しますが、それをしないでください! )。例えば:
struct Base { virtual void f() = 0; };
struct Derived : Base { virtual void f(); }; // must mention f() here...
// then either in same header as Derived (and `inline` per One Definition Rule) or
// out-of-line in an implementation file...
?inline? void Derived::f() { std::cout << "Hello world\n"; } // ...to define it here
f()
inside について言及しない場合struct Derived { }
、コンパイラは次のことを行うと想定します。
= 0
純粋な仮想関数を持っているので利用できない))、または継承された関数/メンバーを継承ステートメントから暗示することはできますか? 読みやすくするために明示的に再宣言する必要がありますか、それとも隠れるリスクがありますか?
ほとんどすべての場合、これは上で述べたことでカバーされます (つまり、新しい定義を提供する関数のみを再宣言します)。例外は、基本クラスで純粋仮想であり、派生クラスで純粋仮想のままである関数の場合です...ドキュメントの価値があると思われる場合は、オプションでそれらを宣言できます-まったく違いはありません。
派生クラスのヘッダー ファイルで何をすべきかわかりません。
通常は次のように指定します。
using
公開したい隠し関数のステートメントvirtual
派生クラスのヘッダーでインライン化されているか、実装ファイルでアウトオブラインであるかに関係なく、新しい定義を提供する関数データ メンバーの定義を繰り返す必要はありません。
C++ 派生クラスは、継承された関数/メンバーの定義をヘッダー ファイルに含める必要がありますか?
ヘッダー ファイルを介して親 (基本) クラス宣言を指定する必要があります。継承された関数は再宣言する必要はありません。
継承された関数/メンバーを継承ステートメントから暗示することはできますか?
私があなたの質問を正しく理解していれば、はい、明示的に再度指定する必要がないという意味で暗示されています。
読みやすくするために明示的に再宣言する必要があります
関数ではなくクラスを継承しているため、関数の再宣言は必要ありません。また、再宣言によって常に可読性が向上するとは限りません (ファイルが乱雑になる可能性もあります)。
または、これは隠れる危険がありますか?
非表示が保証されるため、再宣言しないでください。
継承は基本的な知識であるため、コードを読む他の人は、見つけられないメンバー宣言がないか基本クラスをチェックすることを忘れないでしょう。