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