2013-10-28 6 views
0

기본 클래스에 오버로드 된 함수가있는 경우 적어도 하나 이상을 다시 구현 했으므로 다시 구현하지 않은 모든 오버로드 된 복사본에 대한 기본 클래스의 네임 스페이스를 선언해야하는 이유는 무엇입니까? 예를 들어, 다음 코드를 고려하십시오.오버로드 된 함수 상속 : 네임 스페이스가 필요합니까?

#include <iostream> 


class Base { 
protected: 
    int bar; 

public: 
    Base() : bar(0) {} 
    virtual void Bar(int b) { bar = b; } 
    virtual int Bar() { return bar; } 
}; 

class Foo : public Base { 
protected: 
    int extraBar; 

public: 
    //virtual void Bar(int b) { extraBar = b; } //Uncomment 
}; 

int main() { 

    Foo T; 

    std::cout << T.Base::Bar() << std::endl; 
    std::cout << T.Bar() << std::endl; //will cause code to not compile 

    return 0; 
} 

주위에 쉬운 방법이 있습니까? 내가

func() 
func(var) 
func(var, var, var) 

을 가지고 VAR이 같은 일이 그렇게 찾을와 잘 작동하지 않습니다 FUNC (VAR)에 대체 적이 있기 때문에 나는 손으로 여러 줄의 코드를 수정해야합니다.

+0

@ 아담을 유도 할 수있다? – Chemistpp

+0

C++ 프로그램은 스크립트가 아닙니다. – Adam

+0

어, 일부 코드 일부는 스크립트, 늦었습니다. – Chemistpp

답변

3

당신은 단순히 Foo 클래스에서이

using Base::Bar; 

을 할 수 있습니다. 컴파일러는 Foo::Bar 함수에 의해 숨겨 졌기 때문에 using없이 인수없이 Bar을 찾지 않습니다.

하는 이름입니다

는 중첩 된 선언적 지역에서 같은 이름의 명시 적 선언에 의해 숨겨져 있거나 당신이 무슨 말을하는거야 하늘에서 클래스

+0

'Base :: Bar;를 사용하여 고정했습니다. 나는 과부하가 재 구현되지 않으면'Base :: Bar;를 사용하는 것이 필요하지 않다는 것이 궁금하다. 이로 인해 과부하가 걸린 운영자를 이해하지 못한다고 생각합니다. 내 생각에'Bar()'와'Bar (var)'는 두 개의 다른 함수 였으므로'Foo :: Bar()'를 찾지 못하면'Base :: Bar()'. 감사! – Chemistpp

관련 문제