반응형
객체의 주소 값을 저장 하는 객체 포인터 변수
"C++에서, AAA형 포인터 변수는 AAA 객체 또는 AAA를 직접 혹은 간접적으로 상속하는 모든 객체를 가리킬 수 있다."
즉, 객체의 주소 값을 저장할 수 있다
class Student : public Person
{
...
};
class PartTimeStudent : public Student
{
...
};
Person <- Student <- PartTimeStudent
Person *ptr = new Student();
Person *ptr = new PartTimeStudent();
Student *ptr= new PartTimeStudent();
더 큰 범주의 클래스에서 상속한 클래스를 포인터형으로 가리킬 수 있다.
그렇기 때문에, Person형 포인터라고 해도 가리키는 객체가 Person객체라고 단정지을 수 없다.
[Person형 포인터는 Person 객체 뿐 아니라, Person을 상속하는 모든 객체를 가리킬 수 있기 때문에]
유도 클래스 객체를 기초 클래스 객체로 바라볼 수 있는 근거
Student는 Person이다
PartTimeStudent는 Student이다
PartTimeStudent는 Person이다.
급여관리 시스템 -2단계
- 고용인 Employee
- 정규직 PermanentWorker
- 영업직 SalesWorker
- 임시직 TemporaryWorker
정규직, 영업직, 임시직 모두 고용의 한 형태 [모두 고용인]
영업직은 정규직의 일종 [기본 연봉 + 인센티브]
class ParmanentWorker : public Employee
class TemporaryWorker : public Employee
class SalesWorker : public PermanentWorker
모든 클래스의 객체를 Employee 객체로 간주할 수 있다.
즉, 컨트롤 클래스에서는 모든 객체를 Empoyee 객체로 간주한다.
따라서, EmployeeHandler에서 모든 클래스의 객체를 처리할 수 있다.
//EmployeeHandler.h
#ifndef EMPLOYEEHANDLER_H
#define EMPLOYEEHANDLER_H
#include "Employee.h"
class EmployeeHandler
{
private:
Employee* empList[50]; //1단계에서 바뀐부분 //모든 객체를 Employee 객체를 가리킨다고 간주
int empNum;
public:
EmployeeHandler();
void AddEmployee(Employee* emp); //1단계에서 바뀐부분
void ShowAllSalaryInfo() const;
void ShowTotalSalary() const;
~EmployeeHandler();
};
#endif // !EMPLOYEEHANDLER_H
#pragma once
//EmployeeHandler.cpp
#include <iostream>
#include "Employee.h"
#include "EmployeeHandler.h"
using namespace std;
EmployeeHandler::EmployeeHandler()
:empNum(0)
{
}
void EmployeeHandler::AddEmployee(Employee* emp)
{
empList[empNum++] = emp;
}
void EmployeeHandler::ShowAllSalaryInfo() const
{
/*for (int i=0;i<empNum;i++)
sum+=empList[i]->ShowSalaryInfo();*/
// empList: Employee객체의 포인터 배열
//모든 객체를 Employee객체로 취급
//Employee 객체 안에 해당함수가 없고,
//다른 포인터와 객체를 가리키면 접근이 제한된다 -> Employee 클래스 멤버로 범위가 제한
}
void EmployeeHandler::ShowTotalSalary() const
{
int sum = 0;
/*for (int i=0;i<empNum;i++)
sum+=empList[i]->GetPay();*/
cout << "Salary sum: " << sum << endl;
}
EmployeeHandler::~EmployeeHandler()
{
for (int i = 0; i < empNum; i++)
{
delete empList[i]; empList[i] = NULL;
}
}
//PermanentWorker.h
#ifndef PERMANENTWORKER_H
#define PERMANENTWORKER_H
#include "Employee.h"
class PermanentWorker
:public Employee
{
private:
int salary;
public:
PermanentWorker(const char* name, int money);
int Getpay() const;
void ShowSalaryInfo() const;
};
#endif // !PERMANENTWORKER_H
#pragma once
//PermanentWorker.cpp
#include <iostream>
#include "Employee.h"
#include "PermanentWorker.h"
using namespace std;
PermanentWorker::PermanentWorker(const char* name, int money)
:Employee(name), salary(money)
{
}
int PermanentWorker::Getpay() const
{
return salary;
}
void PermanentWorker::ShowSalaryInfo() const
{
ShowYourName();
cout << "salary: " << Getpay() << endl << endl;
}
//TemporaryWorker.h
#ifndef TEMPORARYWORKER_H
#define TEMPORARYWORKER_H
#include "Employee.h"
class TemporaryWorker
:public Employee
{
private:
int workTime;
int payPerHour;
public:
TemporaryWorker(const char* name, int pay);
void AddWorkTime(int time);
int GetPay() const;
void ShowSalaryInfo() const;
};
#endif // !TEMPORARYWORKER_H
#pragma once
//TemporaryWorker.cpp
#include <iostream>
#include "TemporaryWorker.h"
#include "Employee.h"
using namespace std;
TemporaryWorker::TemporaryWorker(const char* name, int pay)
:Employee(name), workTime(0),payPerHour(pay)
{
}
void TemporaryWorker::AddWorkTime(int time)
{
workTime += time;
}
int TemporaryWorker::GetPay() const
{
return workTime * payPerHour;
}
void TemporaryWorker::ShowSalaryInfo() const
{
ShowYourName();
cout << "salary: " << GetPay() << endl << endl;
}
//SalesWorker.h
#ifndef SALESWORKER_H
#define SALESWORKER_H
#include "PermanentWorker.h"
class SalesWorker
:public PermanentWorker
{
private:
int salesResult;
double bonusRatio;
public:
SalesWorker(const char* name, int money, double ratio);
void AddSalesResult(int value);
int GetPay() const; //PermanentWorker 클래스의 함수를 오버라이딩
void ShowSalaryInfo() const; //PermanentWorker 클래스의 함수를 오버라이딩
};
#endif // !SALESWORKER_H
#pragma once
//SalesWorker.cpp
#include <iostream>
#include "SalesWorker.h"
using namespace std;
SalesWorker::SalesWorker(const char* name, int money, double ratio)
:PermanentWorker(name,money),salesResult(0),bonusRatio(ratio)
{
}
void SalesWorker::AddSalesResult(int value)
{
salesResult += value;
}
int SalesWorker::GetPay() const
{
return PermanentWorker::Getpay() + (int)(salesResult * bonusRatio);
//PermanentWorker의 GetPay 함수 호출
}
void SalesWorker::ShowSalaryInfo() const
//PermanentWorker의 ShowSalaryInfo함수를 호출한다면, PermanentWorker의 GetPay함수를 호출한다.
//SalesWorker의 Getpay함수를 호출해야하기 때문에, 새롭게 정의한다.
{
ShowYourName();
cout << "salary: " << Getpay() << endl << endl;
//SalesWorker의 GetPay 함수 호출
}
//main.cpp
#include <iostream>
#include <cstring>
#include "Employee.h"
#include "PermanentWorker.h"
#include "EmployeeHandler.h"
#include "SalesWorker.h"
#include "TemporaryWorker.h"
using namespace std;
int main(void)
{
//직원관리를 목적으로 설계된 컨트롤 클래스의 객체생성
EmployeeHandler handler;
//정규직 등록
handler.AddEmployee(new PermanentWorker("KIM", 1000));
handler.AddEmployee(new PermanentWorker("LEE", 1500));
//임시직 등록
TemporaryWorker* alba=new TemporaryWorker("Jung",700);
alba->AddWorkTime(5); //5시간 일한 결과 등록
handler.AddEmployee(alba);
//영엉집 등록
SalesWorker* seller = new SalesWorker("Hong", 1000, 0.1);
seller->AddSalesResult(7000); //영업실적 7000
handler.AddEmployee(seller);
//이번 달에 지불해야 할 급여의 정보
handler.ShowAllSalaryInfo();
//이번 달에 지불해야 할 급여의 총합
handler.ShowTotalSalary();
return 0;
}
아직, ShowAllSalaryInfo()함수와 ShowTotalSalary()함수가 완성되지 않았기 때문에 출력되는 정보가 없다.
반응형
'Programming > C++ 3' 카테고리의 다른 글
[C++] 08-03. 가상 소멸자 (0) | 2021.05.30 |
---|---|
[C++] 08-02. 가상함수 [급여관리 시스템 3단계] (0) | 2021.05.29 |
[C++] 07-04. 상속을 위한 최소한의 조건 (0) | 2021.05.29 |
[C++] 07-03. protected 선언과 세 가지 형태의 상속 (0) | 2021.05.29 |
[C++] 07-02. 상속의 문법적인 이해 (0) | 2021.05.29 |