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;
}
: Date(...), Time(...) 顯式呼叫基類建構函數,順序遵循繼承宣告順序 (Date → Time)。Date::year。| 維度 | 多重繼承 | 組合 (含 Date/Time 成員) |
|---|---|---|
| 語意 | 「是一個」關係 (DateTime 是 Date 也是 Time) | 「有一個」關係 |
| 介面存取 | 直接呼叫 dt.SetDate() | 需轉發 dt.date.SetDate() |
| 物件大小 | 單一物件,基類子物件連續佈局 | 包含子物件,相同大小 |
| 轉型 | 隱式向上轉型 Date* p = &dt; | 需顯式 &dt.date |
| 耦合度 | 緊密 (基類變更影響衍生類) | 鬆散 |
建議:若「是一個」關係成立且基類穩定,多重繼承簡潔有力;否則優先組合。