Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- delete function
- virtual destructor
- diamond inheritance
- std::cout
- std::endl
- C++
- member function pointer
- placement new
- constructor
- discord bot
- this call
- base from member
- vector capacity
- c++ multi chatting room
- virtual inheritance
- increment operator
- c++ basic practice
- std::vector
- 더 지니어스 양면포커
- conversion constructor
- virtual function table
- dynamic_cast
- std::ostream
- virtual function
- operator overloading
- pointer to member data
- suffix return type
- new&delete
- return by reference
- vector size
Archives
- Today
- Total
I'm FanJae.
[C++ 기본 연습 문제] Chapter 08. 상속과 다형성 본문
1. Chapter 08. 상속과 다형성
1-1. 상속 관계의 확장과 추상 클래스
① 제 EmployeeManager4.cpp를 확장하여 다음 특성에 해당하는 ForeignSalesWorker 클래스를 추가로 정의해보자
- "영업직 직원 중 일부는 오지산간으로 시장개척을 진행하고 있다. 일부는 아마존에서, 또 일부는 테러의 위험이 있는
지역에서 영업활동을 진행 중에 있다. 따라서 이러한 직원들을 대상으로 별도의 위험수당을 지급하고자 한다."
- 위험수당의 지급방식은 위험의 노출도에 따라서 다음과 같이 나뉘며, 한번 결정된 직원의 '위험 노출도'는 변경되지 않는다고 가정한다(const)
- 리스크 A: 영업직의 기본급여와 인센티브 합계 총액의 30%를 추가로 지급한다
- 리스크 B: 영업직의 기본급여와 인센티브 합계 총액의 20%를 추가로 지급한다
- 리스크 C: 영업직의 기본급여와 인센티브 합계 총액의 10%를 추가로 지급한다
- 다음 main 함수와 함께 동작하도록 ForeignSlaesWorker 클래스를 정의하기 바라며, Employee 클래스는 객체 생성이 불가능한 추상 클래스로 정의하여라.
int main(void)
{
//직원과리를 목적으로 설계된 컨트롤 클래스의 객체 생성
EmployeeHandler handler;
//해외영업직 등록
ForeignSalesWorker *fseller1 = new ForeignSalesWorker("Hong", 1000, 0.1, RISK_LEVEL::RISK_A);
fseller1->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(fseller1);
ForeignSalesWorker *fseller2 = new ForeignSalesWorker("Yoon", 1000, 0.1, RISK_LEVEL::RISK_B);
fseller2->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(fseller2);
ForeignSalesWorker *fseller3 = new ForeignSalesWorker("Lee", 1000, 0.1, RISK_LEVEL::RISK_C);;
fseller3->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(fseller3);
//이번달에 지불해야 할 급여의 정보
handler.ShowAllSalaryInfo();
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
namespace RISK_LEVEL
{
enum { RISK_A=30, RISK_B=20, RISK_C=10};
}
class Employee
{
private:
char name[100];
public:
Employee(const char* name)
{
strcpy(this->name, name);
}
void ShowYourName() const
{
std::cout << "name : " << name << std::endl;
}
virtual int GetPay() const = 0;
virtual void ShowSalaryInfo() const = 0;
};
class PermanentWorker : public Employee
{
private:
int salary; // 월 급여
public:
PermanentWorker(const char* name, int money) : Employee(name), salary(money)
{ }
int GetPay() const
{
return salary;
}
void ShowSalaryInfo() const
{
ShowYourName();
std::cout << "salary : " << GetPay() << std::endl << std::endl;
}
};
class TemporaryWorker : public Employee
{
private:
int workTime;
int payPerHour;
public:
TemporaryWorker(const char* name, int pay) : Employee(name), workTime(0), payPerHour(pay)
{ }
void AddWorkTime(int time)
{
workTime += time;
}
int GetPay() const
{
return workTime * payPerHour;
}
void ShowSalaryInfo() const
{
ShowYourName();
std::cout << "Salary; " << GetPay() << std::endl << std::endl;
}
};
class SalesWorker : public PermanentWorker
{
private:
int salesResult;
double bonusRatio;
public:
SalesWorker(const char* name, int money, double ratio) : PermanentWorker(name, money), salesResult(0), bonusRatio(ratio)
{
}
void AddSalesResult(int value)
{
salesResult += value;
}
int GetPay() const
{
return PermanentWorker::GetPay() // PermanentWorker의 GetPay 함수 호출
+ (int)(salesResult * bonusRatio);
}
void ShowSalaryInfo() const
{
ShowYourName();
std::cout << "salary: " << GetPay() << std::endl << std::endl; // SalesWorker의 GetPay() 함수가 호출됨.
}
};
class EmployeeHandler
{
private:
Employee* empList[50];
int empNum;
public:
EmployeeHandler() : empNum(0)
{
}
void AddEmployee(Employee* emp)
{
empList[empNum++] = emp;
}
void ShowAllSalaryInfo() const
{
for (int i = 0; i < empNum; i++)
{
empList[i]->ShowSalaryInfo();
}
}
void ShowTotalSalary() const
{
int sum = 0;
for (int i = 0; i < empNum; i++)
{
sum += empList[i]->GetPay();
}
std::cout << "salary sum : " << sum << std::endl;
}
~EmployeeHandler()
{
for (int i = 0; i < empNum; i++)
{
delete empList[i];
}
}
};
class ForeignSalesWorker : public SalesWorker
{
private:
const int risk_pay;
public:
ForeignSalesWorker(const char* name, int money, double ratio, int risk_pay) : SalesWorker(name, money, ratio), risk_pay(risk_pay)
{
}
virtual int GetPay() const
{
return SalesWorker::GetPay() + Get_risk_pay();
}
int Get_risk_pay() const
{
return (int)SalesWorker::GetPay() * (risk_pay / 100.0);
}
virtual void ShowSalaryInfo() const
{
ShowYourName();
cout << "salary: " << SalesWorker::GetPay() << std::endl;
std::cout << "risk pay : " << Get_risk_pay() << std::endl;
std::cout << "sum : " << GetPay() << std::endl << std::endl;
}
};
int main(void)
{
//직원과리를 목적으로 설계된 컨트롤 클래스의 객체 생성
EmployeeHandler handler;
//해외영업직 등록
ForeignSalesWorker* fseller1 = new ForeignSalesWorker("Hong", 1000, 0.1, RISK_LEVEL::RISK_A);
fseller1->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(fseller1);
ForeignSalesWorker* fseller2 = new ForeignSalesWorker("Yoon", 1000, 0.1, RISK_LEVEL::RISK_B);
fseller2->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(fseller2);
ForeignSalesWorker* fseller3 = new ForeignSalesWorker("Lee", 1000, 0.1, RISK_LEVEL::RISK_C);
fseller3->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(fseller3);
//이번달에 지불해야 할 급여의 정보
handler.ShowAllSalaryInfo();
return 0;
}
- Employee에 가상 함수를 추가하여 추상 클래스로 만들어 주어야 한다.
'C++ > Basic Practice' 카테고리의 다른 글
[C++ 기본 연습 문제] Chapter 11. 연산자 오버로딩 II (1) | 2024.09.12 |
---|---|
[C++ 기본 연습 문제] Chapter 10. 연산자 오버로딩 I (0) | 2024.09.08 |
[C++ 기본 연습 문제] Chapter 07. 상속(Inheritance)의 이해 (1) | 2024.09.06 |
[C++ 기본 연습 문제] Chapter 05. 복사 생성자(Copy Constructor) (0) | 2024.09.05 |
[C++ 기본 연습 문제] Chapter 04. 클래스의 완성 (0) | 2024.09.04 |
Comments