함수 오버라이딩

sz L·2023년 3월 29일
0

C++

목록 보기
28/40
post-thumbnail

함수 오버라이딩

함수 오버로딩이 함수의 중복 정의라면 함수 오버라이딩은 함수의 재정의이다

오버라이딩은 상속 받았을 때 부모클래스의 함수를 사용하지 않고 다른 기능을 실행할 때 함수를 자식클래스에 같은 이름, 매개변수로 재정의해서 사용하는 것.

함수 오버로딩

  • 메소드 이름이 같아야 한다
  • 반환형이 같아도 되고 달라도 됨
  • 파라미터 개수가 달라야 함
  • 파라미터 개수가 같을 경우, 자료형이 달라야 함

함수 오버라이딩

  • 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야 함
  • 메소드 이름이 같아야 함
  • 메소드 파라미터 개수, 파라미터의 자료형이 같아야 함
  • 메소드 리턴형이 같아야 함
  • 상위 메소드와 동일하거나 내용이 추가되야 함
#include <iostream>
#include <cstring>
using namespace std;

class Employee
{
private:
	char name[100];
public:
	Employee(const char* name)
	{
		strcpy(this->name, name);
	}
	void ShowYourName() const // 함수 상수화(name값 즉, 함수안에 내용이 변경되지 않음)
	{
		cout << "name: " << name << endl;
	}
	virtual int GetPay() const
	{
		return 0;
	}
	virtual void ShowSalaryInfo() const
	{

	}
};

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();
		cout << "salary: " << GetPay() << endl << 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();
		cout << "salary: " << GetPay() << endl << endl; // GetPay()는 저장되지 않고 호출만 되니 임시객체이다
	}
};

class SaleWorker : public PermanentWorker
{
private:
	int saleResult;
	double bonusRatio;
public:
	SaleWorker(const char * name,int money,double ratio):PermanentWorker(name,money),saleResult(0),bonusRatio(ratio)
	{ }
	void AddSalesResult(int value)
	{
		saleResult += value;
	}
	int GetPay() const // 함수 오버라이딩
	{
		return PermanentWorker::GetPay() + (int)(saleResult * bonusRatio);
	}
	void ShowsalaryInfo() const // 함수 오버라이딩
	{
		ShowYourName();
		cout << "salary : " << GetPay() << endl << endl;
	}
};

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();
		}
		cout << "salary sum : " << sum << endl;
	}
	~EmployeeHandler()
	{
		for (int i = 0;i < empNum;i++)
		{
			delete empList[i];
		}
	}
};

int main()
{
	// 직원관리를 목적으로 설계된 컨트롤 클래스의 객체생성
	EmployeeHandler handler;

	// 정규직 등록
	handler.AddEmployee(new PermanentWorker("Lee", 1000));
	handler.AddEmployee(new PermanentWorker("Kim", 1500));

	//임시직 등록
	TemporaryWorker* alba = new TemporaryWorker("Jung", 700);
	alba->AddWorkTime(5);
	handler.AddEmployee(alba);

	//영업직 등록
	SaleWorker* seller = new SaleWorker("Hong", 1000, 0.1);
	seller->AddSalesResult(7000); // '->' 포인터로 접근하는 경우
	handler.AddEmployee(seller);  // '.'  객체를 통해 접근하는 경우

	// 이번 달에 지불해야 할 급여
	handler.ShowAllSalaryInfo();

	// 이번 달에 지불해야 할 급여의 총합
	handler.ShowTotalSalary();
	return 0;
}
  • SalesWorker클래스의 ShowSalaryInfo함수는 PermanentWorker 클래스의 ShowSalaryInfo 함수와 동일한데,
    SalesWorker 클래스에서 ShowSalaryInfo 함수를 오버라이딩 한 이유
    • PermanentWorker 클래스의 ShowSalaryInfo 함수 내에서 호출되는 GetPay 함수는 PermanentWorker 클래스에 정의된 GetPay 함수의 호출로 이어진다.
      따라서 SalesWorker 클래스에 정의된 GetPay 함수가 호출되도록 SalesWorker클래스에 별도의 ShowSalaryInfo 함수를 정의해야한다

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글