1. 介紹
C 語言因其歷史背景及對低層控制的能力,受到許多程式設計師的喜愛。然而,C 語言本身並不是「物件導向語言」。也就是說,與 Java 或 C++ 不同,C 語言並不直接支援物件導向的功能(如類別、繼承、封裝等)。不過,我們仍然可以在 C 語言中模擬物件導向程式設計的概念,並實現部分功能。本文將依序說明如何在 C 語言中實作物件導向程式設計,包括封裝、繼承與多型等基本概念。
2. 物件導向的基本概念
物件導向程式設計(OOP)的目的是將資料及其操作方式整合在一起管理。這樣可以讓程式結構更明確、提升重用性與維護性。物件導向的三大核心概念為封裝、繼承以及多型。雖然 C 語言並未直接支援這些機制,但只要運用一些技巧,還是可以達到類似的效果。
2.1 封裝
封裝指的是將資料及其操作(方法)整合成一個單位,並控制外部對其的存取。在 C 語言中,可以使用結構(struct)來將資料封裝在一起。結構體類似於類別,可將多個資料項目集中管理。
typedef struct {
int age;
char name[50];
} Person;
在這個結構體中,Person
型別將年齡和姓名等資訊封裝在一起。這樣便可建立 Person
的實例,並進行操作。
2.2 繼承
C 語言本身沒有繼承的概念,因此無法像類別一樣建立父子關係。但可以藉由結構體嵌入另一個結構體,達到類似繼承的效果。
typedef struct {
int age;
} Parent;
typedef struct {
Parent parent;
int studentID;
} Child;
在這段程式碼中,Child
結構體內含 Parent
結構體,實現了類似繼承的設計。
2.3 多型(Polymorphism)
多型指的是相同的操作可以作用於不同型態的物件並產生不同行為。在 C 語言中,可以利用函式指標來實現多型。函式指標可儲存函式位址,並可動態呼叫不同函式。
typedef int (*OperationFunc)(int, int);
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
OperationFunc op = add; // 設定為 add 函式
printf("%d", op(3, 4)); // 結果:7
op = multiply; // 切換成 multiply 函式
printf("%d", op(3, 4)); // 結果:12
透過這種方式,可以用相同的函式指標呼叫不同的處理邏輯。

3. 在 C 語言中實作類別的方法
若要在 C 語言中實現物件導向程式設計,必須仿造「類別」的概念,結合結構體和函式指標來建立類似類別的架構。
3.1 以結構體模擬類別
想要在 C 語言實現類別,可將結構體用來整合資料與方法。方法以函式定義,並以函式指標形式存放於結構體內。
typedef struct {
int age;
void (*setAge)(struct Person*, int);
int (*getAge)(struct Person*);
} Person;
void setAge(struct Person* p, int age) {
p->age = age;
}
int getAge(struct Person* p) {
return p->age;
}
Person person = {0, setAge, getAge};
person.setAge(&person, 25);
printf("Age: %d", person.getAge(&person)); // 結果:25
上述程式碼中,Person
結構體擁有 setAge
與 getAge
方法,運作方式接近類別。
4. 方法的實現
若要在 C 語言中實現「方法」這一物件導向特徵,可利用函式指標,將方法定義為結構體的成員。
typedef struct {
int age;
void (*setAge)(struct Person*, int);
} Person;
void setAge(struct Person* p, int age) {
p->age = age;
}
5. 總結與應用
雖然 C 語言可以實現物件導向設計,但因為語言本身不直接支援,需要做一些巧妙的設計。善用結構體、函式指標與記憶體管理,可以在 C 語言中模擬類別和繼承等概念。