2011-01-04 9 views
9

수퍼 클래스의 함수 오버로드를 방지하는 C++ 표준이 있습니까?수퍼 클래스의 함수 오버로드

class A {   // super class 
    int x; 

public: 
    void foo (int y) {x = y;} // original definition 
}; 

class B : public A { // derived class 
    int x2; 

public: 
    void foo (int y, int z) {x2 = y + z;} // overloaded 
}; 

내가 쉽게 B::foo()를 호출 할 수 있습니다 :

B b; 
    b.foo (1, 2); // [1] 

을하지만 ...

B b; 
    b.foo (12); // [2] 

A::foo()를 호출하려고하면 ..

클래스의 쌍을 시작으로 . 컴파일러 오류가 발생합니다.

(210)
test.cpp: In function 'void bar()': 
test.cpp:18: error: no matching function for call to 'B::foo(int)' 
test.cpp:12: note: candidates are: void B::foo(int, int) 

그냥 과부하가되지 않도록 내가 모르는 뭔가가되지 않았다 있는지, 내가 B의 함수의 이름을 변경 만들려면 :

class B : public A { 
    int x2; 

public: 
    void stuff (int y, int z) {x2 = y + z;} // unique name 
}; 

그리고 지금은 두 번째 예제를 사용하여 A::foo()를 호출 할 수 있습니다 .

이 표준인가요? g ++를 사용하고 있습니다.

답변

17

당신은 클래스 B의 정의 내부에 사용 선언을 사용할 필요가 다음 사용하여 선언하지 않고

class B : public A { 
public: 
    using A::foo;   // allow A::foo to be found 
    void foo(int, int); 
    // etc. 
}; 

, 컴파일러는 같은과 다른 엔티티에 대한 기본 클래스를 검색하지 않습니다 효과적으로 이름 검색시 B::foo를 찾아 이름이기 때문에 A::foo을 찾을 수 없습니다.

+1

원래 멤버 함수를 숨기기 취소합니다. –

+6

+1 - Scott Meyers의 Effective C++ 항목에서 자세히 설명되어 있습니다. Item 33 : 상속 된 이름은 숨기지 마십시오. –

0

A::foo(int)의 구현을 오버라이드하지 않고 대신 A::foo의 별칭을 지정하고 서명을 (int) 대신 (int, int)로 변경합니다. James McNellis가 언급 한대로 using A::foo; 선언은 A에서 함수를 사용할 수 있도록합니다.

+0

OP는 "오버라이드"를 말하지 않았고, 오버로드를 말했고, 오버로드는 그가하는 일입니다. 재정의는 가상 함수에 적용됩니다. –

+0

그가하고있는 일은 과부하였습니다. 그가 대신 한 일은 우선하는 것과 비슷한 것이지만 원래의 방법 대신 별칭을 추가하는 보너스가 추가되었습니다. 제임스 맥 넬리 스 (James McNellis)가 지적한 바와 같이, using 문은 문제를 해결하여 과부하를 허용합니다. –