Menu
Coddy logo textTech

復習 - Employee階層

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

challenge icon

チャレンジ

簡単

この章で学んだ継承の概念をすべて組み合わせ、完全な従業員階層システムを構築しましょう。共通の属性を持ちながら、特殊な動作をする異なる種類の従業員による会社構造を作成します。

コードを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()をオーバーライドします
  • Developer.h: Employeeをpublic継承するDeveloperクラスを定義します。Developerは専門の言語を持ち、スキルボーナスを受け取ります。
    • privateのstd::string languageメンバー
    • 名前、id、基本給、プログラミング言語を受け取るコンストラクター
    • 次の内容を出力するようdisplayInfo()をオーバーライドします: Developer: <name> (ID: <id>) - <language>
    • 基本給に1000のスキルボーナスを加えて返すようcalculateSalary()をオーバーライドします
  • main.cpp: 6つの入力を読み取ります(それぞれ別の行に入力)。
    1. Managerの名前
    2. ManagerのID
    3. Managerの基本給
    4. Developerの名前
    5. DeveloperのID
    6. Developerの基本給

    チームサイズ4のManagerと、"C++"を専門とするDeveloperを作成します。両者へのポインターをEmployee*ポインターの配列に格納します。配列をループしてdisplayInfo()を呼び出し、各従業員の計算された給与を次の形式で出力します。

    <displayInfo output>
    Salary: $<calculated salary>

    従業員の間に空行を出力します。すべての従業員を表示した後、動的に確保されたオブジェクトを適切に削除します。

たとえば、入力がSarah1015000Mike1024500の場合:

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;
}

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

自分で練習してみよう: C++オンラインコンパイラ