#1. 개념
1. 디폴트 인자 활용 가상 함수를 오버라이딩?
class Super
{
protected:
virtual void SomeFunc(int val = 3)
{ cout << val; }
};
class Sub : public Super
{
protected:
virtual void SomeFunc(int val = 5)
{ cout << val; }
};
만약, Super 유형의 포인터를 Sub 유형의 객체를 가리키고, 가상 함수를 호출할 경우, Sub 유형의 가상 함수가 호출됩니다. 하지만! 가상 함수가 '디폴트 인자'를 활용할 경우, 직접 코드에서 활용하는 포인터 혹은 참조의 유형이 어떠한 함수를 호출할 것인지 결정하는 요소가 됩니다.
#2. 코드
class Super
{
public:
virtual void go(int i=2)
{
cout << "Super Go With i=" << i << endl;
}
};
class Sub : public Super
{
public:
virtual void go(int i=5)
{
cout << "Sub Go With i=" << i << endl;
}
};
Super super;
Sub sub;
Super& superRefToSub = sub;
super.go(); // Super 타입의 객체
sub.go(); // Sub 타입의 객체
superRefToSub.go(); // Sub 객체를 참조하는 Super 타입의 참조자
Super 클래스에서 정의한 go() 메서드는 2를 출력하고, 이를 오버라이딩한 Sub 클래스의 것은 5를 출력합니다.
이때, Super 타입으로 선언된 포인터는 Sub 타입의 객체를 가리키지만, go() 메서드 호출 시 2를 출력합니다. 따라서, 디폴트 인자 활용 시 포인터 혹은 참조가 가리키는 객체의 타입과 관계없이, 포인터 혹은 참조 선언 시 결정된 클래스 유형이 디폴트 인자 값을 결정합니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #18_오버라이딩의 특수한 경우 여섯 번째, 일반 메소드의 오버라이딩 (0) | 2022.04.30 |
---|---|
[Basic C++] #17_오버라이딩의 특수한 경우 다섯 번째, 복제 생성자, 대입 연산자 (0) | 2022.04.24 |
[Basic C++] #15 오버라이딩의 특수한 경우 세 번째 (0) | 2022.03.26 |
[Basic C++] #14 오버라이딩의 특수한 경우 두 번째 (0) | 2022.03.25 |
[Basic C++] #13_오버로딩, static 함수의 오버로딩 (0) | 2022.03.25 |