多態性
ポリモーフィズムは、オブジェクト指向プログラミングの重要な機能の 1 つであり、文字通りの意味は、複数の形式、複数の外観として単純に理解できます。実際、オブジェクト指向プログラミングでも本質的な意味は同じで、同じメソッドが異なるオブジェクトによって実行されると異なる実行結果が得られることを意味します。
具体的には、ポリモーフィズムの実装は、コンパイル時ポリモーフィズムと実行時ポリモーフィズムの 2 つのタイプに分類できます。前者はコンパイル時に決定される具体的な演算処理であり、後者はプログラムの実行時にのみ決定される演算処理である。この操作プロセスの決定はバインディングであり、バインディングとも呼ばれます。
コンパイルおよび接続中に確認されるバインディングは、静的バインディングと呼ばれます。前に学習した関数のオーバーロードと関数テンプレートのインスタンス化は、このカテゴリに分類されます。もう 1 つは、実行時にどのコードが実行されるかを確認する方法で、これを動的バインディングと呼びます。この場合、どのコードが実行されるかは、コンパイル時に確認することはできず、プログラムを実行した後にのみ確認できます。走る。
この 2 つを比較すると、静的バインディングはコンパイル中に実行方法がすでに決定されているため、実行が効率的ですが、動的バインディングは低速である必要がありますが、その利点は柔軟性です。どちらにも独自のメリットがあり、使用シナリオも異なります。
以下に、静的リンクに関する簡単な例を示します。
/************************************//デス: C++ チュートリアル デモ//作成者: Huang/ /著作権:www.dotcpp.com//日付:2017/12/20********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}doublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
dot クラスと派生 Circle クラスの 2 つのクラスが定義されています。main 関数のコードと 4 つの出力領域の結果を確認できます。
コードを比較して 4 つの出力を理解できます。
最初のcoutはPointクラスのareaメソッドであるAの面積を出力しますので面積は0なので問題ありません。
2 番目の cout は B の面積を出力します。これは明らかに派生クラス Circle の area メソッドです。面積は式に従って自然に計算され、値は 1256.64 で問題ありません。
3 番目の cout は、Point 型ポインター p が指す Circle クラス オブジェクトの area メソッドを出力します。これは明らかに Point クラスの area メソッドです。ここで C++ が実装しているのは静的バインディング、つまりコンパイル時に p の型に基づいてどの領域を実行するかを決定するため、0 になります。
4 番目のタイプの cout も同様に機能し、Circle タイプのオブジェクトを Point タイプの参照に割り当て、静的バインディングを実行し、0 を出力します。
明らかに、これは私たちが期待する結果ではありません。実際、ポインターと参照の場合、このように記述すると問題が生じます。
ポインタや参照がどのような種類であっても、要求を満たしたい場合は、実際に指すオブジェクトに応じて柔軟に決定する必要があります。次に、このデフォルトの静的バインド方法を変更し、実行時に柔軟に決定される動的バインディングを使用する必要があります。
次のセクションでは、仮想関数について詳しく説明します。