728x90
반응형
C++에서 함수 오버로딩(function overloading
) 은 동일한 함수 이름을 사용하면서도 서로 다른 매개변수 목록을 통해 다양한 기능을 구현할 수 있게 해주는 기능입니다.
그러나 상속 관계에서 파생 클래스가 기본 클래스의 함수를 재정의하거나 새로운 함수를 추가할 때, 의도치 않게 기본 클래스의 함수들이 가려질 수 있습니다.
다음 예제를 통해 이러한 상황을 살펴보겠습니다:
cpp
#include <stdio.h>
class B {
public:
void f(int a) { puts("B::f(int)"); }
void f(double a) { puts("B::f(double)"); }
};
class D : public B {
public:
void f(char* a) { puts("D::f(char*)"); }
};
int main() {
D d;
d.f(""); // 정상 작동: D::f(char*) 호출
d.f(1); // 오류 발생: B::f(int) 접근 불가
d.f(2.3); // 오류 발생: B::f(double) 접근 불가
return 0;
}
위 코드에서 D
클래스는 B
클래스를 상속받고 있으며, D
클래스는 char*
타입의 매개변수를 받는 f
함수를 새롭게 정의하고 있습니다.
그러나 D
클래스의 객체 d
를 통해 f(1)
이나 f(2.3)
을 호출하려 하면 컴파일 오류가 발생합니다.
이는 D
클래스에서 f
함수를 새롭게 정의하면서 기본 클래스 B
의 동일한 이름을 가진 함수들이 가려졌기 때문입니다.
이러한 문제를 해결하려면 파생 클래스에서 기본 클래스의 함수를 명시적으로 가져와야 합니다. 이를 위해 using
키워드를 활용할 수 있습니다:
cpp
class D : public B {
public:
using B::f; // 기본 클래스의 f 함수를 가져옴
void f(char* a) { puts("D::f(char*)"); }
};
이렇게 하면 D
클래스의 객체를 통해 B
클래스의 f(int)
와 f(double)
함수도 호출할 수 있게 됩니다.
따라서, 상속 관계에서 함수 오버로딩을 사용할 때는 기본 클래스의 함수들이 가려지지 않도록 주의해야 하며, 필요 시 using
키워드를 활용하여 기본 클래스의 함수를 명시적으로 가져와야 합니다.
728x90
반응형
'C C++' 카테고리의 다른 글
[CodeBlocks & wxPack] 손쉽게 Windows에서 wxWidgets(wxWindows) 개발 환경 구성하기 (3) | 2009.10.30 |
---|---|
Google ctemplate (0) | 2009.07.08 |
GCC를 활용한 공유 라이브러리 생성 및 활용 방법 (0) | 2009.03.07 |
Windows XP 에서 Cygwin 구성 - (2) (0) | 2009.02.19 |
C++ 자료형의 최대/최소값 (0) | 2009.02.16 |