在這個類別圖中,Person 是一個抽象類別,因為它有抽象方法(在UML中以斜體表示):GetPersonalInformation 和 UpdateRoleTitle。這意味著它們在 Person 類別中不具備具體的實現,必須由繼承 Person 類別的子類別來實現,這就是方法的覆寫。
Police 和 Staff 是 Person 類別的具體子類別。它們必須實現(覆寫)Person 類別的抽象方法,提供這些方法的具體實現。
多載(Overloading)是指在同一範圍中有多個具有相同名稱但參數不同的方法。在這個類別圖中沒有明確表示有多載方法,因為多載通常會在同一類別中以不同的參數數量或類型來呈現。
以下是 Person 類別和 Police 類別的C++實現:
cpp
Copy code
#include <iostream>
#include <string>
// 抽象基類別 Person
class Person {
protected:
std::string id_no;
std::string name;
public:
Person(const std::string& id, const std::string& name) : id_no(id), name(name) {}
virtual ~Person() {}
virtual std::string GetPersonalInformation() = 0; // 抽象方法
virtual void UpdateRoleTitle(const std::string& newTitle) = 0; // 抽象方法
};
// Police 類別
class PoliceRank {
public:
std::string code;
std::string rank;
PoliceRank(const std::string& c, const std::string& r) : code(c), rank(r) {}
};
class Police : public Person {
private:
PoliceRank police_rank;
public:
Police(const std::string& id, const std::string& name, const PoliceRank& rank)
: Person(id, name), police_rank(rank) {}
std::string GetPersonalInformation() override { // 覆寫方法
return "身分證:" + id_no + ", 姓名:" + name + ", 職稱:" + police_rank.rank;
}
void UpdateRoleTitle(const std::string& newRank) override { // 覆寫方法
police_rank.rank = newRank;
}
};
// 範例使用
int main() {
PoliceRank rank("001", "Sergeant");
Police officer("A123456789", "John Doe", rank);
std::cout << officer.GetPersonalInformation() << std::endl;
officer.UpdateRoleTitle("Lieutenant");
std::cout << officer.GetPersonalInformation() << std::endl;
return 0;
}
在這段代碼中,GetPersonalInformation 和 UpdateRoleTitle 被 Police 類別覆寫來提供具體的實現。UpdateRoleTitle 接受一個新職稱並更新 PoliceRank 對象。
注意,如果你需要一個運行時多態的行為,應該使用指針或引用來操作 Person 類別的對象。在這個簡單的例子中,我們直接使用了 Police 對象。在一個更複雜的系統中,你可能會有一個 Person 指針的數組來管理多個不同種類的 Person 對象。