
上期我們講解了C實現動態多態的原理今天我們來講解一下在C語言中如何做到這一點。眾所周知C語言是一門面向過程的語言所以它沒有封裝繼承多態這些屬性但是我們可以通過C語言的函數指針和回調函數實現類似動態多態的效果。C語言實現動態多態1. 函數指針2. 回調函數2.1 回調函數定義2.2 回調函數的應用場景3. 實現多態3.1 預備知識3.2 代碼1. 函數指針1.1 函數指針是指向函數的指針變量。1.2 通常我們說的指針變量是指向一個整型、字符型或數組等變量而函數指針是指向函數。1.3 函數指針可以像一般函數一樣用于調用函數、傳遞參數。1.4 聲明一個指向同樣參數、返回值的函數指針類型int (*p)(int,int);2. 回調函數2.1 回調函數定義回調函數就是一個通過函數指針調用的函數。如果你把函數的指針地址作為參數傳遞給另一個函數當這個指針被用來調用其所指向的函數時我們就說這是回調函數。 —來自菜鳥教程2.2 回調函數的應用場景在內核編程中驅動程序就要提供一些回調函數當一個設備的數據讀寫完成后讓系統調用這些回調函數來執行一些后續工作。3. 實現多態3.1 預備知識小提示C語言中函數名也和數組名一樣代表著地址可以由下圖可知。用指針取得函數的地址和用函數名直接打印出來的結果相同說明函數名就是地址。不過此時可能有小伙伴有疑問了對函數名和直接使用函數名有什么區別所以這里就簡單區分一下。對于 father 和 father 應該這樣理解father 是函數的首地址它的類型是 void ()father 表示一個指向函數 fun 這個對象的地址 它的類型是 void (*)()類型不一樣father 是一個函數father 表達式的值是一個指針3.2 代碼此時可以通過更改dospeak函數的參數來調用不同的函數從而達到動態多態的效果