では、構造体は仮想関数を持ち、継承をサポートできるようになりましたか?では、クラスとどのような違いがありますか?情報隠蔽の真の目的は何ですか?[複製]
-
27-09-2019 - |
質問
重複の可能性:
C ++の構造体とクラスの違いは何ですか http://www.cplusplus.com/reference/std/typeinfo/ type_info /
私の「先生」は、C ++の構造体とクラスの違いについてあまり教えてくれなかったと思います。
継承に関して、structはデフォルトでパブリックであるという他の質問を読みました...また、structにはコンストラクタ/デストラクタがないと思います...
それでは、他にどのような違いがありますか?それらはそれほど重要ですか?
プライベート/保護された属性/メソッドについて話すとき、コンパイラがコンパイル時にそのように指示し、エラーを報告するという理由だけで、実行時にアクセスできませんよね?次に、これらの機能をクラスと比較すると、「情報隠蔽」は実際にプログラマーに何をもたらしますか?誰かがクラスを再利用するときに、プライベート/保護されたものがコンパイラによって報告されるため、この人がクラスを誤用しないようにするためにここにありますか?
私はまだ情報隠蔽の本当の目的に苦労しています。それでもプログラムのセキュリティが向上し、セキュリティ違反が少なくなるように頭の中で聞こえたいのですが、言語でのそのような設計の目標については本当に混乱しています。 ...(そして、私はC ++に反対するつもりはありません。この機能がどのような場合に興味深いかどうかを理解するだけです。そうでない場合、それは問題ではありませんが、知りたいのですが... 。
解決
コンパイラに関する限り、struct
とclass
の間に、デフォルトのアクセシビリティ以外の違いはありません。これらは、同じものを定義するための2つの異なるキーワードにすぎません。したがって、構造体には、コンストラクタ、デストラクタ、基本クラス、仮想関数など、すべてを含めることができます。
プログラマーに関する限り、これらの要素がないクラス(具体的には POD )、またはさらに進んで、ユーザー定義のメンバー関数がまったくなく、パブリックデータメンバーのみのクラスにのみstruct
を使用します。クラスがPODでない場合でも、クラスがPODであると考えるのは驚くほど簡単であるため、人々はこの規則を台無しにすることがありますが、少なくとも彼らは試みています。
C ++では、少なくとも、情報の隠蔽はセキュリティとはまったく関係ありません。それを頭から離れてください。優れたコーディング手法によって推論が容易なコードが作成されるのと同じ一般的な方法を除いて、セキュリティは提供されないため、プログラマーはミスを減らすことができます。
情報隠蔽の目的は、後で実装を変更できるようにすることです。おそらく、クラス自体や友人以外のクラスのユーザーがそれらを参照していないことを知っていれば、プライベートメンバーを削除または名前変更することができます。 。明らかにそれを正確に行うことは有用ですが、それほど明白ではなく、おそらくもっと重要なことですが、クラスのインターフェースが何であるか、クライアントが使用したい 、そしてクラスは当然のことながら機能することを期待できます。原則としてドキュメントで同じことを達成できますが、実際には、コンパイラがルールを適用するのは良いことです。
どのコンパイラでもパブリック/プライベート保護を回避できるため、「安全」ではありません。しかし、クラスのユーザーがそれを行う場合、彼らはグロテスクなハックを使用しています。クラスを変更したときにコードのコンパイル/動作を停止する価値があります。ユーザーが不満を言ってきた場合は、笑うことができます。>