復習 - Employee階層
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 55/104。
チャレンジ
簡単この章で学んだ継承の概念をすべて組み合わせ、完全な従業員階層システムを構築しましょう。共通の属性を持ちながら、特殊な動作をする異なる種類の従業員による会社構造を作成します。
コードを4つのファイルに分けて整理します。
Employee.h: すべての従業員タイプが継承する基底Employeeクラスを定義します。すべての従業員は、名前、ID、基本給を持ちます。以下を含めます。- 名前(
std::string)、id(int)、baseSalary(double)のprotectedメンバー - 3つすべての値を初期化するコンストラクター
- 次の内容を出力する仮想
displayInfo()メソッド:Employee: <name> (ID: <id>) - 基本給を返す仮想
calculateSalary()メソッド - 仮想デストラクタ
- 名前(
Manager.h:Employeeをpublic継承するManagerクラスを定義します。Managerはチームの規模に基づくボーナスを受け取ります。- privateの
int teamSizeメンバー - 名前、id、基本給、チームサイズを受け取るコンストラクター。適切に基底コンストラクターへチェーンします
- 次の内容を出力するよう
displayInfo()をオーバーライドします:Manager: <name> (ID: <id>) - Team of <teamSize> - チームメンバー1人につき500を基本給に加えて返すよう
calculateSalary()をオーバーライドします
- privateの
Developer.h:Employeeをpublic継承するDeveloperクラスを定義します。Developerは専門の言語を持ち、スキルボーナスを受け取ります。- privateの
std::string languageメンバー - 名前、id、基本給、プログラミング言語を受け取るコンストラクター
- 次の内容を出力するよう
displayInfo()をオーバーライドします:Developer: <name> (ID: <id>) - <language> - 基本給に1000のスキルボーナスを加えて返すよう
calculateSalary()をオーバーライドします
- privateの
main.cpp: 6つの入力を読み取ります(それぞれ別の行に入力)。- Managerの名前
- ManagerのID
- Managerの基本給
- Developerの名前
- DeveloperのID
- Developerの基本給
チームサイズ4のManagerと、"C++"を専門とするDeveloperを作成します。両者へのポインターを
Employee*ポインターの配列に格納します。配列をループしてdisplayInfo()を呼び出し、各従業員の計算された給与を次の形式で出力します。<displayInfo output> Salary: $<calculated salary>従業員の間に空行を出力します。すべての従業員を表示した後、動的に確保されたオブジェクトを適切に削除します。
たとえば、入力が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クラス自分で練習してみよう: C++オンラインコンパイラ