多態是強大設計機制,允許繼承抽象 public 介面後封裝相關型別,代價是額外間接性——記憶體獲取與型別決策上。C++ 透過 class pointer 和 references 支援多態,此程式風格稱為「面向物件」。
典型範例:iostream 同時繼承 istream 和 ostream:
class iostream : public istream, public ostream { ... };
本質上**沒什麼差別**,但需掌握何時用哪個。通常混合使用。書中方法:組合——用 struct 封裝 class 資料:
struct C_Point { ... }; // 結構
class Point {
public:
operator C_Point() { return _c_point; }
// ...
private:
C_Point _c_point;
// ...
};
好處:struct 封裝 class 資料,使 C++ 和 C 都有合適的記憶體佈局,同一物件模型可在兩語言應用。
需求:建立人員資訊鏈表、新增/刪除人員、顯示人員。
設計思路:
Personnel 提供介面Member 繼承 Personnel,擴充詳細資料與權限Supermember 繼承 MemberManagemember 繼承 Member(程式碼省略)point_list 實作鏈表插入/刪除/列印核心程式碼節錄:
class Personnel {
friend class point_list;
protected:
char serial_number[15], name[10], password[15];
Personnel *pointer, *next_link;
public:
Personnel(char* sn, char* nm, char* pwd) { ... }
virtual void addnew() {}
virtual void display() { ... }
};
class Member : public Personnel {
friend class point_list;
private:
char member_email[50], member_gender[10];
double member_age;
public:
Member(...) : Personnel(...) { ... }
void addnew() { pointer = this; }
void display() { Personnel::display(); ... }
};
class Supermember : public Member {
friend class point_list;
private:
int sm_documentcount, sm_codecount;
public:
Supermember(...) : Member(...) { ... }
void display() { Member::display(); ... }
};
class point_list {
private:
Personnel *location;
public:
point_list() : location(0) {}
void print(); // 遍歷顯示
void insert(Personnel*); // 依名稱排序插入
void delete(char* serial_number); // 依編號刪除
};
int main() {
point_list pl;
Supermember sm1("001", "雷神", "123456", "a@b.com", "男", 29.9, 10, 10);
Supermember sm2("002", "木一", "234567", "c@d.com", "男", 26.5, 20, 5);
Supermember sm3("003", "落葉夏日", "345678", "e@f.com", "男", 24.8, 5, 15);
pl.insert(&sm1); pl.insert(&sm2); pl.insert(&sm3);
pl.print();
pl.delete("001");
pl.print();
}
輸出結果展示三人資訊,刪除編號 001 後剩餘兩人。
透過範例理解物件模型帶來的好處:大量使用指標與參考實現多態。與書上資料庫範例不同,這裡多一層(考慮匿名 vs 註冊用戶),所有註冊正式成員由 Member 派生出不同權限人員(超級成員、管理人員)。
多態是強大設計機制,允許繼承抽象 public 介面後封裝相關型別,代價是額外間接性——記憶體獲取與型別決策上。C++ 透過 class pointer 和 references 支援多態,此程式風格稱為「面向物件」。