객체 포인터 변수: 객체의 주소 값을 저장하는 포인터 변수

Person *ptr;
ptr = new Person();

위의 두분장이 실행되면, 포인터 ptr은 Person 객체를 가리키게 된다. 그런데 Person형 포인터는 Person 객체뿐만 아니라, Person을 상속하는 유도 클래스의 객체도 가리킬 수 있다.

Person *ptr = new Student(); 
class PartTimeStudent : public Student{};
//위와 같다 가정시
Person *ptr = new PartTimeStudent() // 도 가능하다.
//그리고 당연하게
Student *ptr = new PartTimeStudent();

유도 클래스의 객체까지 가리킬 수 있다니!

생략.

오렌지미디어 급여관리 확장성 문제의 1차적 해결과 함수 오버라이딩

int GetPay() const
{
	return PermanentWorker::GetPay()
		+ (int)(salesResult*bonusRatio);
}

“PermanentWorker 클래스에도 GetPay 함수와 ShowSalaryInfo 함수가 있는데, 유도 클래스인 SalesWorker 클래스에도 동일한 이름과 형태로 두 함수를 정의하였네.”

이를 가리켜 ‘함수 오버라이딩(function overriding)’이라 한다(함수 오버로딩과 혼동하지 말자).

위와 같이 PermanentWorker::GetPay()
//를 통해 기초 클래스의 GetPay 함수를 호출할수 있다.
//or
seller.PermanentWorker::ShowSalaryInfo();

“seller 객체의 PermanentWorker 클래스에 정의된 ShowSalaryInfo 함수를 호출해라.”

이렇게 까지 해서 오버라이딩 된 기초 클래스의 함수를 호출하는 일은 거의 없으므로, 이러한 문장의 구성이 가능하다는 사실 정도만 기억하기 바란다.

SalesWorker 클래스에서 ShowSalaryInfo 함수를 오버라이딩 한 이유는?

몸체가 같아도 오버라이딩 해서 SalesWorker의 ShowSalaryInfo 가 불리게 하여야 한다.