Menu
Coddy logo textTech

まとめ:従業員の階層構造

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 55/104。

challenge icon

チャレンジ

簡単

この章で学んだすべての継承の概念を統合した、完全な従業員階層システムを構築しましょう。共通の属性を共有しながら、特化した動作を持つ異なる従業員タイプの会社構造を作成します。

コードは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つの入力(それぞれ別の行)を読み込みます:
    1. マネージャーの名前
    2. マネージャーのID
    3. マネージャーの基本給
    4. デベロッパーの名前
    5. デベロッパーのID
    6. デベロッパーの基本給

    チームサイズ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;
}

オブジェクト指向プログラミングのすべてのレッスン