[セットトップ]C/C+--多態現象に対する理解

2746 ワード

多態問題のまとめ:C/C++--C++コンパイラはどのように多態C/C++--構造関数の中で虚関数を呼び出して多態を実現することができますか(Vptrポインタの初期化の過程の分析)C/C+--C++の中で構造関数が虚関数ではない原因分析C/C+--C++の中で虚析構造関数を定義する原因
C++の3つの特性:パッケージ、継承、およびマルチステート.
多態特性分析は主にいくつかの方面がある:多態の表現形式、多態実現の条件、多態がどのように実現するか、多態の理論基礎.
マルチステートの実装効果
同じ呼び出し文には多くの異なる表現形態がある.
関数void printObj(Parent*pbase)は、次の例を参照してください.関数は、サブクラスの関数をベースクラスポインタで呼び出すことができます.
#include <iostream>
using namespace std;

class Parent{
    public:
        Parent(int a = 0){
            this->a = a;
        }
        virtual void print()
        {
            cout << "Parent, a = " << a << endl;
        }
    private:
        int a;
};

class Child:public Parent{
    public:
        Child(int b = 0){
            this->b = b;
        }
        //void print()
        virtual void print()//   virtual           ,                   virtual
        {
            cout << "Child, b = " << b << endl;
        }

    private:
        int b;
};

void printObj(Parent * pbase)
{
    pbase->print();
}

int main()
{
    Parent p(10);
    Child c(11);

    printObj(&p);
    printObj(&c);

    return 0;
}

出力:Parent,a=10 Child,b=11
出力結果からprintObj(&c);入力されるのはサブクラスオブジェクトですが、関数のパラメータは親のポインタです.しかし、確かに呼び出されたのはサブクラスオブジェクトのprint関数です.この現象は多態である.
マルチステート実装の3つの条件
継承、virtual書き換え、親ポインタ(参照)が子オブジェクトを指します.この3つの条件は,上記の例で見ることができる.
マルチステートが実装されると
virtualキーワードは、コンパイラにこの関数がマルチステートをサポートすることを教えます.ポインタのタイプに基づいて呼び出す方法を判断しないでください.ポインタが指す実際のオブジェクトタイプに基づいて呼び出す方法を判断します.
たじょうたいのりろんきそ
動的結合PK静的結合.書き換え関数の呼び出しは、実際のオブジェクトタイプに基づいて判断されます.
多態の重要な意義
設計モードの基礎.
多態を実現する理論の基礎
関数ポインタを関数パラメータにする