C ++仮想:ポインタを延期することを決定

仮想基本原則

仮想関数、またはクラス階層かどうか、彼の本当の機能はしている意思決定ポインタを延期します

ウィルに延期コンパイル時のランタイム決定決定を、その多型の原則の多状態の実装が存在している実行時に動的バインディング

クラス変数を継承、仮想基底クラスは、ポインタは延期することを指すことがある曖昧さの問題サブクラスを解決し、廃棄物の問題を保存します

コンパイル:仮想関数を指している関数名の記号は空です

ファイル名を指定して実行:仮想関数ポインタ指示物体ドメインではなく、クラスのフィールド

仮想何の機能をすることができ

  1. 一般的なメンバ関数をすることができ
  2. コンストラクタは、仮想することはできません
  3. デストラクタは仮想することができ

一般的な仮想関数メンバ

  • 声明:仮想return_typeのFUNC_NAME(formal_parameter_list)
  • 関数プロトタイプの宣言だけでクラス定義に表示されます
  • 派生クラスで基本クラスのメンバ関数をカバーすることができる(なぜなら多型の影響を、継承された非仮想関数をしない書き換えません)
  • 仮想関数の呼び出しは動的であるため、仮想関数は、一般的に、インライン関数を宣言されていない、とインライン関数は静的コンパイル処理であります

さらに、1 派生クラスの仮想関数は、オーバーライド基本クラスをカバー追加した場合、仮想関数宣言キーワードかどうかを、仮想関数として定義され

基本クラスのディスプレイをオーバーロード派生クラスの仮想関数をオーバーロード同じ名前の2その他の機能は、(一時的ではないことを確認する理由)非表示になります

そのため、カバーは一般的に派生したクラスの仮想関数グループ機能は、プラスどのように仮想キーワードの一般的な、読みやすさを向上させます

 

仮想デストラクタ

使用シナリオ:コール・オブジェクトへのポインタ基底クラス(基本クラスオブジェクトまたは派生クラス)デストラクタを使用するために他人を可能とする、我々は仮想デストラクタを使用する必要がある - これは行う必要があり、削除操作は正常になります。逆に、そうでない場合この時間デストラクタベース・クラス・オブジェクト・ポインタポイントので基本クラスのデストラクタに結合静的に格納された関数テーブルへのオブジェクトポインタに仮想デストラクタ、挙動は予測不可能であり、削除、マルチステート、我々を使用して基本クラス派生オブジェクトポインタ操作多型塩基のクラスデストラクタは、メモリリーク原因派生オブジェクト関連するメモリ空間を解放しない場合。

 

仮想キーワードを実装し、ダイナミックに垣間見るビューを達成するために結合します

仮想テーブル

各クラスは、多型仮想テーブル(仮想テーブル)を有し、それぞれのクラスの仮想関数で現在のテーブルエントリの仮想アドレスは、各オブジェクトが現在のクラス(vptr)の仮想テーブルへのポインタを有し、多型仮想テーブルに基づいて、仮想キーワードは、期間、どの機能エントリアドレスのいくつかは、あなたがエントリアドレスが実行されている仮想テーブルの実行初期化関数の値を見つけるために呼び出す仮想テーブルの値とを決定するために、仮想テーブルを配置することをコンパイラに指示します。

 

この記事では、C ++のコースZHENG英清華大学の先生に関与の一部である  プログラムアドレスノートとあなたが漠然と言ってチュートリアルを比較した場合、あなたが行くとコースの例を見るとできるか、を考えます

ところで:反射との思い出のために再びこのブログを学んできた、初心者にはお勧めできません、あなたはかすかあり

公開された17元の記事 ウォンの賞賛1 ビュー10000 +

おすすめ

転載: blog.csdn.net/TowerOs/article/details/103947275