9

タイトルはほとんどそれをすべて言います-派生クラスは、親クラスから継承された関数/データメンバーの定義をヘッダーファイルに再インクルードする必要がありますか?

継承された関数/メンバーを継承ステートメントから暗示することはできますか? 読みやすくするために明示的に再宣言する必要がありますか、それとも隠れるリスクがありますか?

派生クラスのヘッダー ファイルで何をすべきかわかりません。

4

3 に答える 3

5

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派生クラスのヘッダーでインライン化されているか、実装ファイルでアウトオブラインであるかに関係なく、新しい定義を提供する関数

データ メンバーの定義を繰り返す必要はありません。

于 2013-11-07T07:40:01.857 に答える
2

C++ 派生クラスは、継承された関数/メンバーの定義をヘッダー ファイルに含める必要がありますか?

ヘッダー ファイルを介して親 (基本) クラス宣言を指定する必要があります。継承された関数は再宣言する必要はありません。

継承された関数/メンバーを継承ステートメントから暗示することはできますか?

私があなたの質問を正しく理解していれば、はい、明示的に再度指定する必要がないという意味で暗示されています。

読みやすくするために明示的に再宣言する必要があります

関数ではなくクラスを継承しているため、関数の再宣言は必要ありません。また、再宣言によって常に可読性が向上するとは限りません (ファイルが乱雑になる可能性もあります)。

または、これは隠れる危険がありますか?

アクセス修飾子が変更されない限り、情報の隠蔽または抽象化は影響を受けません。

于 2013-11-05T22:04:19.860 に答える
1

非表示が保証されるため、再宣言しないでください。

継承は基本的な知識であるため、コードを読む他の人は、見つけられないメンバー宣言がないか基本クラスをチェックすることを忘れないでしょう。

于 2013-11-05T22:05:39.673 に答える