Nice programing

기본 클래스 메서드에 액세스하기 위해 "using"키워드를 사용해야하는 이유는 무엇입니까?

nicepro 2020. 11. 18. 21:28
반응형

기본 클래스 메서드에 액세스하기 위해 "using"키워드를 사용해야하는 이유는 무엇입니까?


내 문제를 설명하기 위해 아래 코드를 작성했습니다. 11 행 (키워드 "using")에 주석을 추가하면 컴파일러는 파일을 컴파일하지 않고 다음 오류를 표시합니다 invalid conversion from 'char' to 'const char*'.. 이 방법 볼 것 같다 void action(char)Parent에서 클래스를 Son클래스입니다.

컴파일러가 이런 식으로 작동하는 이유는 무엇입니까? 아니면 내가 뭔가 잘못 했나요?

class Parent
{
    public:
        virtual void action( const char how ){ this->action( &how ); }
        virtual void action( const char * how ) = 0;
};

class Son : public Parent
{
    public:
        using Parent::action; // Why should i write this line?
        void action( const char * how ){ printf( "Action: %c\n", *how ); }
};

int main( int argc, char** argv )
{
    Son s = Son();
    s.action( 'a' );
    return 0;
}

action파생 클래스 숨 깁니다에서 선언 된 action기본 클래스에 선언했다. 객체에서 사용 action하는 경우 Son컴파일러는에 선언 된 메서드를 검색하고라는 메서드 Son를 찾아서 action사용합니다. 이미 일치하는 이름을 찾았 기 때문에 기본 클래스의 메서드에서 검색하지 않습니다.

그러면 해당 메서드가 호출의 매개 변수와 일치하지 않고 오류가 발생합니다.

이 주제에 대한 자세한 설명 C ++ FAQ참조하십시오 .


놀랍게도 이것은 표준 동작입니다. 파생 클래스가 기본 클래스에서 정의한 메서드와 이름이 같은 메서드를 선언하면 파생 클래스의 메서드는 기본 클래스의 메서드를 숨 깁니다.

C ++ FAQ 참조


주의 사항 :이 상황에서 "사용"을 사용해야하는 것은 코드가 다른 개발자에게 혼란을 줄 수 있다는 위험 신호입니다 (결국 컴파일러를 혼란스럽게합니다!). 다른 프로그래머가 구별 할 수 있도록 두 가지 방법 중 하나의 이름을 바꿔야합니다.

한 가지 가능성 :

void action( const char how )
{ 
  takeAction( &how ); 
}
void action( const char * how )
{
  takeAction(how);
}
virtual void takeAction(const char * how) = 0;

파생 클래스에서 오버로드 된 함수가 재정의되면 기본 클래스의 모든 오버로드 된 함수가 숨겨집니다. 두 기능을 모두 포함하는 한 가지 방법은 클래스에서 함수 오버로딩을 방지하는 것입니다. 또는 사용 된대로 using키워드 를 사용할 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/1896830/why-should-i-use-the-using-keyword-to-access-my-base-class-method

반응형