[Basic C++] #15_오버라이딩의 특수한 경우 세 번째
C++ 개발에서 오버라이딩을 사용 시 주의할 점에 대해서 알아보겠습니다.
"전문가를 위한 C"의 9 항목, "클래스 상속 활용 테크닉"에 해당하는 내용입니다.
private 또는 protected 가상 멤버 함수를 오버라이드 할 경우
class Times
{
public:
virtual int getTimesResult() const
{return getDeafualtOperand() * getInputOperand;} // 디폴트 Operands 값 * 인자로 들어온 operands
void setInputOperand (int i) {inputOperand = i;}
void getInputOperand () {reutrn inputOperand;}
private:
int inputOperand;
virtual int getDefaultOperand() {return 5;}
}
class Times6 : public Times
{
private:
virtual int getDefaultOperand() override { return 6; } // 5 대신 6을 반환하도록 재정의
};
위 코드 예제를 살펴보겠습니다.
책에 나온 내용을 쉽게 각색한 내용이니 부자연스러워도 이해 부탁드립니다.
먼저 Times 객체는 Default Operand 값을 5로 정의합니다.
"getTimesResult" public 멤버 함수는 인자로 들어온 Input Operand를 getDefaultOperand 멤버 함수가 반환하는 값과 곱셈 연산을 하여 결과 값을 반환합니다.
이때, "getDefaultOperand" 가상 멤버 함수는 private 영역에 위치합니다.
파생 클래스 Times6 클래스는 이 가상 멤버 함수를 재정의 할 수 있으며, 5 대신 6을 반환하도록 재정의 합니다.
private 또는 protected로 접근 권한이 설정된 부모 클래스의 가상 함수도 오버라이딩이 가능합니다.
"점근 지정자(public, private, protected)"의 경우 누가 해당 메서드를 호출할 수 있는지 제한할 뿐,
오버라이딩과 관련이 없습니다!
따라서, private 또는 protected 영역에 선언된 가상 함수를 파생 클래스에서 직접 호출할 수 없지만,
오버라이딩, 즉 재정의 하는 동작은 가능합니다.
이러한 구현 방법은 전반적인 변경이 필요하지 않고, 특정 속성만 변경이 필요할 때 private 또는 protected 가상 멤버 함수를 오버라이딩 하는 것이 좋습니다.
'언어 > Basic C++' 카테고리의 다른 글
[Basic C++] #17_오버라이딩의 특수한 경우 다섯 번째, 복제 생성자, 대입 연산자 (0) | 2022.04.24 |
---|---|
[Basic C++] #16_오버라이딩의 특수한 경우 네 번째, 디폴트 인자 값 (0) | 2022.04.03 |
[Basic C++] #14 오버라이딩의 특수한 경우 두 번째 (0) | 2022.03.25 |
[Basic C++] #13_오버로딩, static 함수의 오버로딩 (0) | 2022.03.25 |
[Basic C++] #12 순수 가상 함수, 추상 클래스 (0) | 2022.03.25 |