C++/summary

다형성을 이용한 Employee Problem 예제.

gandus 2010. 10. 4. 09:13

#include<iostream>
#include<string>
using namespace std;

class Employee{

 string name;
 int sabun;

public:
 Employee(int s, string n ) : name(n), sabun(s){}

 int GetSabun() { return sabun;}
 string GetName() { return name; }

 virtual int GetPay() { return 0; }  // 다형성을 위한 재정의 함수, 동적 바인딩

};

class Permanent : public Employee {
 
 int salary; // 연봉 , 나중에 salesman 추가시는 프로텍티드로 바꾸면 된다.

public:
 Permanent(int s, string n, int sal) : Employee(s, n), salary(sal) {  }

 int GetPay() { return salary/12; }

};

class Temprory : public Employee { // 비정규직
 
 int time, pay;

public :
 Temprory(int s, string n, int t, int p) : Employee(s,n), time(t), pay(p) {}
 
 int GetPay() { return time*pay; }

};


class Department {  // has - a 관계이다. 상속이 아님
 Employee *emplist[10];  
 // Employee emplist[10]; 이렇게 되면 자식변수를 참조 못해서 포인터로
 // 이런식으로 has-a 관계를 이용한다.

 int index; //직원 수를 나타내는 값

public:
 Department( ) : index(0) {  }

 void AddEmp (Employee *p ) { emplist[index++] = p; }
 // [index++] 다음 호출시 인덱스를 증가시킨다.
 
 void PayList() {

  for(int i=0; i<index; i++){
   cout<< "사번 : " << emplist[i]->GetSabun()<<endl;
   cout<< "이름 : " << emplist[i]->GetName()<<endl;
   cout<< "월급 : " << emplist[i]->GetPay()<<endl;
   cout<<"--------------------"<<endl;
   // emplist[i]->GetPay()에서 다형성이 이러남, 정규/비 정규직의 월급
  }
 }
};


void main(){
 
 Department d; // 부서 생성

 d.AddEmp(new Permanent(1,"김동현", 3000));
 d.AddEmp(new Permanent(2,"이규돈", 4000));
 d.AddEmp(new Permanent(3,"김태경", 5000));
 d.AddEmp(new Temprory(4,"박종훈", 1, 400));
 d.AddEmp(new Temprory(5,"마탄", 12, 500));

 d.PayList();

}



만약 세일즈맨 추가시에는

class SalesPerson : public Permanent{

 int sales;

public :
 
 SalesPerson(int s, string n, int sal, int sale) :
    Permanent(s, n, sal), sales(sale){}

    int GetPay() { return salary/12 + sales*0.15; }              // salrary 는 프로텍티드로

};