まとめ:従業員の階層構造
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 55/104。
チャレンジ
簡単この章で学んだすべての継承の概念を統合した、完全な従業員階層システムを構築しましょう。共通の属性を共有しながら、特化した動作を持つ異なる従業員タイプの会社構造を作成します。
コードは4つのファイルに分けて構成します:
Employee.h: すべての従業員タイプの継承元となる基底クラスEmployeeを定義します。すべての従業員は、名前、ID、基本給を持っています。以下を含めてください:- 名前 (
std::string)、ID (int)、基本給 (double) のための保護された(protected)メンバ - これら3つの値を初期化するコンストラクタ
Employee: <name> (ID: <id>)と出力する仮想メソッドdisplayInfo()- 基本給を返す仮想メソッド
calculateSalary() - 仮想デストラクタ
- 名前 (
Manager.h:Employeeを公開継承(public inheritance)するManagerクラスを定義します。マネージャーはチームの人数に応じたボーナスを受け取ります:- プライベートな
int teamSizeメンバ - 名前、ID、基本給、チームの人数を受け取るコンストラクタ — 基底クラスのコンストラクタを適切に呼び出してください
displayInfo()をオーバーライドして、Manager: <name> (ID: <id>) - Team of <teamSize>と出力するようにしますcalculateSalary()をオーバーライドして、基本給にチームメンバー1人につき500を加算した額を返すようにします
- プライベートな
Developer.h:Employeeを公開継承するDeveloperクラスを定義します。デベロッパーは専門の言語を持ち、スキルボーナスを受け取ります:- プライベートな
std::string languageメンバ - 名前、ID、基本給、プログラミング言語を受け取るコンストラクタ
displayInfo()をオーバーライドして、Developer: <name> (ID: <id>) - <language>と出力するようにしますcalculateSalary()をオーバーライドして、基本給に1000のスキルボーナスを加算した額を返すようにします
- プライベートな
main.cpp: 6つの入力(それぞれ別の行)を読み込みます:- マネージャーの名前
- マネージャーのID
- マネージャーの基本給
- デベロッパーの名前
- デベロッパーのID
- デベロッパーの基本給
チームサイズ4のマネージャーと、"C++" を専門とするデベロッパーを作成します。両方のポインタを
Employee*ポインタの配列に格納します。配列をループで回してdisplayInfo()を呼び出し、各従業員の計算された給与を次の形式で出力します:<displayInfo output> Salary: <displayInfo output> Salary: $<calculated salary>lt;calculated salary>従業員の間に空行を1行出力してください。すべての従業員を表示した後、動的に割り当てられたオブジェクトを適切に削除(delete)してください。
例えば、入力が Sarah, 101, 5000, Mike, 102, 4500 の場合:
Manager: Sarah (ID: 101) - Team of 4
Salary: $7000
Developer: Mike (ID: 102) - C++
Salary: $5500このチャレンジは、ポリモーフィズムの実際の動作を示しています。基底クラスのポインタを介して仮想メソッドを呼び出すことで、正しい派生クラスの実装が呼び出されます。override キーワードを使用すること、および適切なクリーンアップのために基底クラスに仮想デストラクタを含めることを忘れないでください。
自分で試してみよう
#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"
using namespace std;
int main() {
// Manager の入力を読み込む
string managerName;
int managerId;
double managerSalary;
getline(cin, managerName);
cin >> managerId;
cin >> managerSalary;
cin.ignore();
// Developer の入力を読み込む
string developerName;
int developerId;
double developerSalary;
getline(cin, developerName);
cin >> developerId;
cin >> developerSalary;
// TODO: チームサイズ 4 の Manager を作成する
// TODO: "C++" を専門とする Developer を作成する
// TODO: 両方の従業員を格納するための Employee* ポインタの配列を作成する
// TODO: 配列をループで回し、各従業員に対して以下を行う:
// - displayInfo() を呼び出す
// - 次のように出力する: Salary: $<calculated salary>
// - 従業員の間に空行を出力する(最後の従業員の後には出力しない)
// TODO: 動的に割り当てられたオブジェクトを削除する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス