C語言實現多態(這些比較好)

綜述
多態性是面向對象程序設計的一個重要特徵,利用多態性能夠設計和實現一個易於擴展的系統。函數

顧名思義,多態的意思是多種形態,在C++程序設計中,多態指的是:具備不一樣功能的函數能夠用同一個函數名,這樣能夠用一個函數名調用不一樣內容的函數。this

C++的多態分兩種:靜態多態性和動態多態性。.net

1. C++中的函數重載和運算符重載實現的多態性就屬於靜態多態,在程序編譯時系統就能決定調用的是哪一個函數,所以靜態多態性又稱爲編譯時多態性。靜態多態性是經過函數重載實現的(運算符重載實質上也是函數重載)。設計

2.動態多態實在程序運行過程當中才動態肯定操做指針指向的對象。它又被稱爲運行時多態。動態多態是經過虛函數實現的。指針

C語言雖然不是面向對象的語言,可是C語言一樣能夠實現多態性,在Linux 內核中就大量存在利用C語言實現多態性的代碼。對象

C語言實現編譯時多態性
C語言能夠經過宏實現編譯時多態,下面是一個例子:
#define ADD(A, B) (A) + (B);
int main(){
    int a =1;
    int b =2;
    cout<<ADD(a,b);//輸出3
    string c = "asd";
    string d = "fff";
    cout<<ADD(c,d);//輸出 asdfff
    return 0;
}blog

對於不一樣的類型的A和B,帶參數的宏 ADD 會根據傳入的是 int類型或是string 類型而採起不一樣的 +的策略。
C語言實現動態多態性
C語言能夠用函數指針實現動態多態,下面是例子:
#include <stdio.h>
#include <stdlib.h>
 
//虛函數表結構
struct base_vtbl
{
    void(*dance)(void *);
    void(*jump)(void *);
};
 
//基類
struct base
{
    /*virtual table*/
    struct base_vtbl *vptr;
};
 
void base_dance(void *this)
{
    printf("base dance\n");
}
 
void base_jump(void *this)
{
    printf("base jump\n");
}
 
/* global vtable for base */
struct base_vtbl base_table =
{
        base_dance,
        base_jump
};
 
//基類的構造函數
struct base * new_base()
{
    struct base *temp = (struct base *)malloc(sizeof(struct base));
    temp->vptr = &base_table;
    return temp;
}
 
 
//派生類
struct derived1
{
    struct base super;
    /*derived members */
    int high;
};
 
void derived1_dance(void * this)
{
    /*implementation of derived1's dance function */
    printf("derived1 dance\n");
}
 
void derived1_jump(void * this)
{
    /*implementation of derived1's jump function */
    struct derived1* temp = (struct derived1 *)this;
    printf("derived1 jump:%d\n", temp->high);
}
 
/*global vtable for derived1 */
struct base_vtbl derived1_table =
{
    (void(*)(void *))&derived1_dance,
    (void(*)(void *))&derived1_jump
};
 
//派生類的構造函數
struct derived1 * new_derived1(int h)
{
    struct derived1 * temp= (struct derived1 *)malloc(sizeof(struct derived1));
    temp->super.vptr = &derived1_table;
    temp->high = h;
    return temp;
}
 
 
 
int main(void)
{
 
    struct base * bas = new_base();
    //這裏調用的是基類的成員函數
    bas->vptr->dance((void *)bas);
    bas->vptr->jump((void *)bas);
 
 
    struct derived1 * child = new_derived1(100);
    //基類指針指向派生類
    bas  = (struct base *)child;
 
    //這裏調用的實際上是派生類的成員函數
    bas->vptr->dance((void *)bas);
    bas->vptr->jump((void *)bas);
    return 0;
}繼承

上面代碼不只實現了多態的性質,其實也在模擬C++中的類的繼承。主函數中基類指針 bas 一開始指向的是基類對象,所以調用 dance 和jump是基類的dance jump 。下面把bas 指向派生類的對象,再調用dance 和jump 的時候就不是基類的dance 和jump了,而轉化成了派生類的dance 和jump.
--------------------- 
做者:feiqiangs 
來源:CSDN 
原文:https://blog.csdn.net/dumpling5232/article/details/52632060 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!string

相關文章
相關標籤/搜索