#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 는 프로텍티드로
};