避難の要約の下にC ++多型の個人的な理解にされています:
1.事前バインディングと遅延バインディングは何と呼ばれていますか?
事前バインディングは、オブジェクトがその型で宣言し、関連付けを確立したときにことを意味しています。
遅延バインディングは、実行時にそのコードを意味し、オブジェクトは、我々は必要なメソッドとプロパティを提供するかどうかを確認してください。
静的協会(事前バインディング)とダイナミック協会(遅延バインディング)。
2.多型は何ですか?
インターフェース、様々な方法。
3.多型と非多型の違いは?
非多型の機能間の多型と本質的な違いは、事前バインディングまたは遅延バインディングを対処することです。関数を呼び出す場合、コンパイラの間に関数呼び出しのアドレスを決定することができ、そのアドレスが早期にバインドされ、コードが静的で生成します。関数呼び出しとは、遅延バインディングに属し実行時に決定ニーズに対処した場合。
4.ノー仮想関数(なしメンバ変数)のサイズを持つクラス?
空のクラスのサイズは、1 0ではありません。
仮想関数(なしメンバ変数)のサイズを持つクラス?
そのような1つまたは複数とchar型可変部材を含むものとして、それがメンバ変数と見なさなければならない場合、仮想関数テーブルポインタ,,メンバ変数の型を有すると同等のものを生成するオブジェクト(番号のみです仮想テーブル)仮想メンバ関数は、チャー、ポインタのsizeof()8サイズを有する等価です。
6.あなたは、コンストラクタで仮想関数を呼び出すことができますか?
あなたは、コンストラクタで仮想関数を呼び出すときは、事前バインディングを使用することは、つまり、仮想関数の仕組みは、コンストラクタでは動作しません。
C ++のコンストラクタでは、仮想関数呼び出しは自動的に通常の関数呼び出しコンパイラに変換されます。
7.なぜコンストラクタは、仮想することはできませんか?
1。オブジェクトが構築されるコンパイラが、正しいオブジェクトを生成するために、正確な型を知る必要があるので、遅延バインディングを使用することはできません。
2。コンストラクタが実行される前に、オブジェクトの仮想関数テーブルポインタが仮想関数テーブルを使用してコンストラクタを呼び出すことがない、正しく初期化されていない、仮想関数のメカニズムによって知ることができます。
3。クラスは複数のコンストラクタを持っている場合はC ++では、コンストラクタは他のコンストラクタを呼び出すことができます。
8.純粋仮想関数と仮想関数の違いは?
純粋仮想関数は、これだけの機能を持って宣言されているが、任意のサブクラスでは、この関数のメンバ関数を継承するように、この機能の内容を与えるものではありません。この関数を定義しなければならない、など
定義されていない場合、サブクラスも抽象クラスであり、オブジェクトを生成することができません。
機能自体は、基本クラスを使用することで、この関数を定義していない場合は、この機能と任意のサブクラスに加えて、この機能を持つように宣言仮想関数はメンバ関数を継承します
この関数は、この関数のサブクラスを再定義する場合に選択することによって、基本クラスへのポインタを介して目的に応じて決定することができる機能です。
9.どのように仮想関数が定義されましたか?
のみ自動的に、仮想関数となり、対応する機能が追加の仮想を必要としないサブクラス化し、基底クラスの仮想関数がなったら、文を定義するときに前に追加する必要が仮想追加する必要がありません
もちろん、サブクラスのサブクラス対応する機能は、自動的に仮想関数になります。
重要10.仮想関数は、次のことを理解します:
- クラスA
- {
- パブリック:
- 仮想空セイ();
- 仮想〜A(){COUT << "〜A" << ENDL;}
- }。
- {COUT << "Aセイ" << ENDL;} ::セイ()を無効。
- クラスB:公共A
- {
- パブリック:
- 空セイ(無効)。
- 〜B(){COUT << "〜B" << ENDL;}
- }。
- ボイドB ::セイ(ボイド){COUT << "Bセイ" << ENDL;}
- int型_tmain(int型のargc、_TCHAR * ARGV [])
- {
- * pを=新しいB;
- P->セイ();
- Pを削除します。
- システム(「一時停止」)。
- 0を返します。
- }
1.仮想関数の役割は、上記の例では、遅延バインディングであり、*はP =新しいB; P->セイ(); セイ()仮想関数は、動的に)(ランタイムセイで適切なオブジェクトを選択する場合、仮想でない場合は、のみを選択し、セイ()、あなたは理解する必要があり、その動的なB bとして、リンクされていない場合は、b.Say();、静的コンパイラコンパイラはBを呼び出すために知っていますセイ()、仮想関数ではないが、問題ではない、
2デストラクタは、これはオブジェクトのために、好ましくは仮想宣言Pを削除しない場合、*はP =新しいB、新しい、上記の例です。削除P場合、およびBのデストラクタは確かに、呼び出されませんが、デストラクタが仮想ではない、それが唯一のデストラクタを呼び出します、Bは、デストラクタを呼び出すことはありません。 2とデストラクタはデストラクタを呼び出し、次にBのデストラクタを呼び出して、仮想関数であれば、実際には同じ理由です。
3.デストラクタは、仮想されていないかどうか、このような静的なBのB文は、最初にBのデストラクタが呼び出されますデストラクタを呼び出す場合
ます。https://www.cnblogs.com/sjlove/p/3168593.htmlで再現