기본 클래스 메서드에 액세스하기 위해 "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
키워드 를 사용할 수 있습니다 .
'Nice programing' 카테고리의 다른 글
Python에서 가장 효율적인 그래프 데이터 구조는 무엇입니까? (0) | 2020.11.18 |
---|---|
선언시 새로운 C ++ 11 멤버 초기화 기능이 초기화 목록을 쓸모 없게 만들었습니까? (0) | 2020.11.18 |
Python의 '열거'함수에 해당하는 Java가 있습니까? (0) | 2020.11.18 |
: before와 :: before의 차이점은 무엇입니까? (0) | 2020.11.18 |
반복하는 동안 Java8의 스트림 내에서 객체 수정 (0) | 2020.11.18 |