程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 面向對象多態的理解,面向對象多態理解

面向對象多態的理解,面向對象多態理解

編輯:C++入門知識

面向對象多態的理解,面向對象多態理解


一、多態的概念

多態 (polymorphism) 一詞最初來源於希臘語 polumorphos,含義是具有多種形式或形態的情形。在程序設計領域,一個廣泛認可的定義是“一種將不同的特殊行為和單個泛化記號相關聯的能力”。然而在人們的直觀感覺中,多態的含義大約等同於“同一個方法對於不同類型的輸入參數均能做出正確的處理過程,並給出人們所期望獲得的結果”,也許這正體現了人們對於多態性所能達到的效果所寄予的期望:使程序能夠做到越來越智能化,越來越易於使用,越來越能夠使設計者透過形形色色的表象看到代碼所要觸及到的問題本質。

二、多態的分類

總體是分為通用多態和專用多態:

通用多態:不同的類型值,執行相同的代碼。

專用多態:不同的類型值,執行不同的代碼。(類似枚舉 “什麼類型,執行什麼操作”)

通用多態分為:參數多態和包含多態

參數多態:參考c++中的template(靜態聯編時候實現)

包含多態:可以理解為abstract functions,interface的方法(動態聯編時候實現,)

專用多態:強制多態和重載多態

強制多態:可以理解為類型的隱式轉換(靜態聯編時候實現)

重載多態:參考C++中的函數重載的理解(靜態聯編時候實現)

2.1 參數多態

概念:采用參數化模板,通過給出不同的類型實參,使得一個結構有多種類型。

  • 從C++的模板結構可以看出:
    對實參所取的類型不加限制;
    對不同的實參執行的是相同的代碼。
  • 在一個抽象結構中允許以參量形式來表示可變的類型、函
    數、常數、數據值,在編譯時(靜態)進行實例化,結果
    是一個具體的結構(類型、函數等)。

2.2 包含多態

概念:同樣的操作可用於一個類型及其子類型。

      例:Pascal  中的子界。子類型:a value of a subtype can be used everywhere a value of the supertype can be expected.
      注意:子類型與將來要介紹的子類是有區別的。包含多態一般需要進行運行時的類型檢查。

2.3 過載多態

概念:同一個名(操作符、函數名)在不同的上下文中有不同的類型。

      程序設計語言中基本類型的大多數操作符都是過載多態的。

2.4 強制多態

概念:編譯程序通過語義操作,把操作對象的類型強行加以變換,以符合函數或操作符的要求。

  • 程序設計語言中基本類型的大多數操作符,在發生不同類型的數據進行混合運算時,編譯程序一般都會進行強制多態。
  • 程序員也可以顯式地進行強制多態的操作(Casting)。

三、C語言一條語句實現四種多態

老師要求我們用C語言的一條語句實現四種多態,想了半天,只能這樣寫了,下面是代碼,可能理解上有出入,包含多態的語句不太確定的是。

復制代碼
#include <stdio.h>
enum dataType 
 { 
    INT, 
    DOUBLE, 
    CHAR, 
 }; 
int f(void *a,int dataType){//這裡實現了參數多態的函數!
    switch (dataType){
    case 1:
        {
        int x=*(int*)a;
        break;
        }
    case 2:
        {
        char x=*(char*)a;
        break;
        }
    case 3:
        {
         double x=*(double*)a;
        break;
        }
    }
    return 0;
}
void main (){
    int i=1;
    double j=2.0;
    float  a=3.0,b=4.0;//double的子類型
    double c=5.0,d=6.0;
    printf("參數多態%d,%d\n包含多態%lf,%lf\n過載多態%f,%lf\n強制多態%lf\n",sizeof(int),c*d,a*b,(1+2),(1.0+2.0),1);
    //本條語句分別實現了參數、包含、過載、強制多態
}
復制代碼

      這裡要講的是參數多態,雖然覺得實現起來用處不大,但是至少C可以實現。主要用到的是void,幾乎所有講授 C 語言課程的老師都會告訴你:“指針是整個 C 語言的精髓所在。”而你也一直敬畏著指針,又愛又恨地使用著它。許多教材都告訴你,int * 叫做指向整型的指針,而 char * 是指向字符型的指針,等等不一而足。然而這裡有一個另類的指針家族成員—— void *。不要按照通常的命名方式叫它做指向 void 類型的指針,它的正式的名字叫做:可以指向任意類型的指針。你一定注意到了“任意類型”這四個字,沒錯,實現多態,我們靠的就是它。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved