有効なC ++項目36:オブジェクト指向(継承非仮想関数を再定義していない)の継承

まず、非仮想関数を隠すの例を見て

  • 次のコードは、クラス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の概要

  • 再定義非仮想関数は、継承されたことはありません
发布了1525 篇原创文章 · 获赞 1085 · 访问量 45万+

おすすめ

転載: blog.csdn.net/qq_41453285/article/details/104817474