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

C++ 繼承實戰範例:日期與時間類別的多重繼承設計

     編輯:VC 教學

領域模型

  • Date:年、月、日 + 格式化輸出。
  • Time:時、分、秒 + 格式化輸出。
  • DateTime:同時擁有日期與時間功能,自然採用**多重繼承**。

程式碼實現


#include 
#include 
using namespace std;

class Date {
protected:
    int year, month, day;
public:
    Date() {}
    Date(int y, int m, int d) : year(y), month(m), day(d) {}
    void SetDate(int y, int m, int d) { year=y; month=m; day=d; }
    string GetString() const {
        char buf[20]; sprintf(buf, "%d/%d/%d", year, month, day);
        return string(buf);
    }
};

class Time {
protected:
    int hour, minute, second;
public:
    Time() {}
    Time(int h, int m, int s) : hour(h), minute(m), second(s) {}
    void SetTime(int h, int m, int s) { hour=h; minute=m; second=s; }
    string GetString() const {
        char buf[20]; sprintf(buf, "%d:%d:%d", hour, minute, second);
        return string(buf);
    }
};

// 多重繼承:DateTime 同時是 Date 和 Time
class DateTime : public Date, public Time {
public:
    DateTime() {}
    DateTime(int y, int mo, int d, int h, int mi, int s)
        : Date(y, mo, d), Time(h, mi, s) {}
    string GetString() const {
        char buf[40];
        sprintf(buf, "%d/%d/%d %d:%d:%d", year, month, day, hour, minute, second);
        return string(buf);
    }
};

int main() {
    DateTime dt1, dt2(2024, 5, 20, 14, 30, 0);
    dt1.SetDate(2024, 5, 19);
    dt1.SetTime(9, 15, 30);
    cout << "dt1: " << dt1.GetString() << endl;
    cout << "dt2: " << dt2.GetString() << endl;
    return 0;
}

關鍵設計細節

  1. Protected 資料成員:衍生類別直接存取基類資料,避免 getter/setter 開銷。
  2. 建構函數初始化列表:: Date(...), Time(...) 顯式呼叫基類建構函數,順序遵循繼承宣告順序 (Date → Time)。
  3. 無虛擬繼承:Date 與 Time 無共同基類,無菱形問題,不需虛擬繼承。
  4. 名稱衝突預防:兩基類成員名稱不重疊 (year/month/day vs hour/minute/second),無需域解析 Date::year。

多重繼承 vs 組合 比較

維度多重繼承組合 (含 Date/Time 成員)
語意「是一個」關係 (DateTime 是 Date 也是 Time)「有一個」關係
介面存取直接呼叫 dt.SetDate()需轉發 dt.date.SetDate()
物件大小單一物件,基類子物件連續佈局包含子物件,相同大小
轉型隱式向上轉型 Date* p = &dt;需顯式 &dt.date
耦合度緊密 (基類變更影響衍生類)鬆散

建議:若「是一個」關係成立且基類穩定,多重繼承簡潔有力;否則優先組合。

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