Linux 內核 struct proto_ops 大量使用函數指針作為成員,實現面向對象的多態:
struct proto_ops {
int family;
int (*release)(struct socket *sock);
int (*bind)(struct socket *sock, struct sockaddr *addr, int len);
int (*connect)(struct socket *sock, struct sockaddr *addr, int len, int flags);
// ... 更多操作
};
這是 C 語言模擬「介面/虛函數」的核心模式:數據結構 + 函數指針 = 多態。
int (*release)(struct socket *sock);
// 讀法:release 是指針,指向「參數為 socket*,返回 int」的函數
#include <stdio.h>
#include <stdlib.h>
int func1(int n) { printf("func1: %d\n", n); return n; }
int func2(int n) { printf("func2: %d\n", n); return n; }
int main() {
// 數組元素類型:int (*)(int)
int (*fp[2])(int) = { func1, func2 };
fp[0](1); // 輸出 func1: 1
fp[1](2); // 輸出 func2: 2
return 0;
}
int (*fp[2])(int):fp 是數組,元素是函數指針fp[i](arg) 與普通函數一致| 特性 | C 結構體 | C++ 結構體/類 |
|---|---|---|
| 成員函數 | 不允許 | 允許 |
| 封裝 | 無 | public/private/protected |
| 繼承/多態 | 手動模擬 | 原生支持 |
| 默認訪問 | public | struct:public, class:private |