首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

深度探索 C++ 物件模型(三):多重繼承、結構vs類別、面向物件模型實戰範例

     編輯:VC 教學

導讀:多態的代價

多態是強大設計機制,允許繼承抽象 public 介面後封裝相關型別,代價是額外間接性——記憶體獲取與型別決策上。C++ 透過 class pointer 和 references 支援多態,此程式風格稱為「面向物件」。

三大常見問題解答

  1. C++ 支援多重繼承嗎?
  2. 結構與類別差別是什麼?
  3. 如何設計面向物件模型?

1. C++ 支援多重繼承(Java/C# 不支援)

典型範例:iostream 同時繼承 istream 和 ostream:


class iostream : public istream, public ostream { ... };

2. struct vs class 差別

本質上**沒什麼差別**,但需掌握何時用哪個。通常混合使用。書中方法:組合——用 struct 封裝 class 資料:


struct C_Point { ... }; // 結構
class Point {
public:
    operator C_Point() { return _c_point; }
    // ...
private:
    C_Point _c_point;
    // ...
};

好處:struct 封裝 class 資料,使 C++ 和 C 都有合適的記憶體佈局,同一物件模型可在兩語言應用。

3. 面向物件模型實戰:人員管理鏈表

需求:建立人員資訊鏈表、新增/刪除人員、顯示人員。

設計思路:

  • 基底類別 Personnel 提供介面
  • 正式成員 Member 繼承 Personnel,擴充詳細資料與權限
  • 超級成員 Supermember 繼承 Member
  • 專案經理 Managemember 繼承 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 支援多態,此程式風格稱為「面向物件」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved