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();
생략.
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 가 불리게 하여야 한다.