728x90
반응형

C++ 함수 가림 현상(name hiding)과 using 키워드 활용하기

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
반응형

+ Recent posts