まず、非仮想関数を隠すの例を見て
- 次のコードは、クラスBから公開方法クラスDの継承に仮定する。
class B {
public:
void mf();
};
class D :public B {};
int main()
{
D x;
B *pB = &x;
pB->mf(); //调用B::mf()
D *pD = &x;
pD->mf(); //调用D::mf()
return 0;
}
第二に、静的結合と動的バインディング
- 静的結合について、動的結合は、記事のテキストの残りの一部で見つけることができます:
静的バインディング
- 我々は、ポインタ関連のタイプの非仮想関数呼び出し機能バージョンを呼び出すとき
- 初期化したときのPDポインタの上、および結合Dオブジェクト、初期化したとき、例えば、鉛ポインタ上、オブジェクトDはBのオブジェクトにバインドされています。これは、バインディング、静的です
- したがって、PBはB :: MF()が呼び出され、パラジウムコールはD :: MF()であります
動的バインディング
- 我々は仮想関数を呼び出すときに、関数呼び出しを約持つオブジェクトポインタを解放します
- 仮想関数を呼び出すには、コードの動作中に実行されています。D :: MF(上記)仮想関数である場合、例えば、そこになります。
class B {
public:
virtual void mf();
};
class D :public B {
public:
virtual void mf();
};
int main()
{
D x;
B *pB = &x;
pB->mf(); //调用D::mf()
D *pD = &x;
pD->mf(); //调用D::mf()
return 0;
}
第三には、なぜ、基本クラスの派生クラスの皮の非仮想関数をお勧めしません。
- 32導入、公共の継承手段の面である関係、非仮想関数を宣言する理由34が記述項目は、クラスでその特異性をオーバーライドし、クラスの不変性を確立します。もし:
- 私たちは、非仮想ベースクラスの派生クラスで隠し、基底クラスと行動に一貫性のない生成されます派生クラスは、ある関係がなくなっています
- あなたは、基本クラスの異なる派生クラスを表示したい場合は、仮想(一例であり、仮想デストラクタ)の関数として宣言する必要があります
IVの概要