2012-06-18 3 views
2

왜 컴파일되지 않습니까?
오류 C2660 : 'Concrete :: WriteLine': 함수가 1 개의 인수를 취하지 않습니다.
줄을 추가하면 알고 있습니다 :
// AbstractBase :: WriteLine;
작동하지만 그 이유를 이해하지 못합니다.C++ 순수 가상 함수 상속 (같은 서명)

#include "iostream" 

class AbstractBase 
{ 
public: 
    virtual void WriteLine() = 0; 
    virtual void WriteLine(int i) 
    { 
     std::cout<<"AbstractBase"<<std::endl; 
    } 
}; 

class Concrete : public AbstractBase 
{ 
public: 
    //using AbstractBase::WriteLine; 
    virtual void WriteLine() 
    { 
     std::cout<<"Concrete Sub Class"<<std::endl; 
    } 
}; 

int main() 
{ 
    Concrete ff; 
    ff.WriteLine(); 
    ff.WriteLine(1); 
    return 0; 
} 

누군가 여기서 일어날 일을 설명해 줄 수 있습니까? 고맙습니다


이 동작은 C++의 standart에서 정의 된 행동 인 경우 누구나 알고 있습니까. C++ 스탠드 아트에 언급되어 있습니까? 아니면 그냥 일종의 컴파일러 동작입니까?

답변

8

.
매개 변수를 사용하지 않는 위의 함수는 같은 이름의 함수를 숨기고 하나의 매개 변수를 사용합니다. 컴파일러는 매개 변수가 하나 인 함수를 찾을 수 없으므로 오류를보고합니다.

라인 :

using AbstractBase::WriteLine; 

이 가능 (의 범위가에서 제공) 모든 숨겨진 파생 클래스에서 기본 클래스에서 이름 때문에 함수가 하나 개의 매개 변수를 가지고 사용할 수 있습니다.

좋은 읽기 : Concrete::WriteLine 모든 AbstractBase::WriteLines를 숨기고 있다는 것을
What's the meaning of, Warning: Derived::f(char) hides Base::f(double)?

2

메서드 숨기기이 발생합니다. 기본 클래스의 다른 함수는 서명이 다르지만 같은 이름의 함수에 의해 숨겨집니다. 파생 클래스에서

using AbstractBase::WriteLine; 

:

이 문제를 해결하려면 using 지시어를 사용할 수있는 파생 클래스에서 함수를 선언

class Concrete : public AbstractBase 
{ 
public: 
    using AbstractBase::WriteLine; 
    //using AbstractBase::WriteLine; 
    virtual void WriteLine() 
    { 
     std::cout<<"Concrete Sub Class"<<std::endl; 
    } 
}; 
+0

당신이 가지고있는 것은 *** 네임 스페이스 선언 ***을 사용하고 *** 네임 스페이스 지시문 ***을 사용하는 것이 아니라 모두 동일하지 않습니다. –

+0

@Als : 단지 _using 선언 ._ 관련된 네임 스페이스가 없습니다. –

+0

@MikeSeymour : 음 ... 네, 맞습니다. 키워드를 검색하면 차이가 발생하기 때문에 키워드로 이동했습니다. –

1

에 같은 이름을 가진 모든 기능을 숨 깁니다 기본 클래스 - 파생 클래스 함수의 잠재적 인 과부하로 간주되지 않습니다.

using 선언을 추가하면 숨겨진 함수가 파생 클래스의 범위로 되돌려지며 파생 클래스 함수와 함께 잠재적 인 과부하로 간주됩니다. 파생 클래스에서

void WriteLine() 

같은 이름을 가진 모든 기본 클래스 기능을 숨 깁니다 : 당신이 함수를 선언하면

1

문제입니다. 파생 클래스에

using AbstractBase::WriteLine; 

을 추가 할 수 있습니다.