ポリモーフィズム:メンバー関数が仮想関数であるかどうかを判断する方法(つまり、関数の書き換えまたはカバレッジ)

ポリモーフィズムの概念:静的ポリモーフィズムと動的ポリモーフィズムに分けられた、同じものの複数の兆候。
1. 静的ポリモーフィズムは、関数のオーバーロードやジェネリックプログラミングのように、コンパイル時に反映されます。

関数のオーバーロード:

  1. スコープは同じです。
  2. いくつかの関数は同様の関数を持ち、同じ関数名を持っています。
  3. パラメータは同じではありません(異なるパラメータタイプ、数、または順序)。
  4. 呼び出すときの関数のパラメータに従って、呼び出す関数を知ってください。

2. 実行時に反映される動的ポリモーフィズムは、次の2つの条件を満たす必要があります。

  1. 仮想関数
    決定関数は仮想関数(書き換え可能)のメンバーではありません。2つの3つの条件があります:
    1)基本クラスと派生クラスで定義された2つのそれぞれのメンバー関数;
    2)基本クラスで定義されたメンバー関数は必須です。キーワードvirtualを使用すると、派生クラスのメンバー関数を取得するかどうかを指定できます。
    3)2つのメンバー関数プロトタイプ(関数名、関数パラメーター、関数の戻り値の型)は同じである必要があります。

注:これら2つの関数の戻り値の型が基本クラスと派生クラスであり、戻り値が基本クラスと派生クラスへのポインターまたは参照である場合も、上書きを構成します。この戻り値の型は共分散と呼ばれます。

2.オブジェクトの仮想関数を呼び出すときは、オブジェクトポインターまたは参照を使用します。これにより、ポインターが異なるオブジェクトを指すときに、異なるタイプのメンバー関数を呼び出すことができ、ポリモーフィズムが反映されます。

プログラム分析は次のとおりです。

#include<iostream>
using namespace std;

class Grandam
{
public:
    virtual void introduce_self()
    {
        cout << "I am grandam." << endl;
    }
};

class Mother:public Grandam
{
public:
    void introdude_self()
    {
        cout << "I am mother." << endl;
    }
};

class Daughter :public Mother
{
public:
    void introduce_self()
    {
        cout << "I am daughter." << endl;
    }
};

int main()
{
    Grandam* ptr;
    Grandam g;
    Mother m;
    Daughter d;
    ptr = &g;
    ptr->introduce_self();

    ptr = &m;
    ptr->introduce_self();

    ptr = &d;
    ptr->introduce_self();
    return 0;
}

結果を図に示します。

ここに写真の説明を書いてください

結果から、オブジェクトの仮想関数introduce_self()バージョンが毎回実行されることがわかります。これは、実行時のポリモーフィズムを反映しています。

おすすめ

転載: blog.csdn.net/lxp_mujinhuakai/article/details/69399959