2013-03-16 2 views
5

C++ 코드는 다음과 같습니다 컴파일하는 동안상속에서 하나의 메서드 만 재정의 할 수 있습니까? 다음과 같이

#include<iostream> 
using namespace std; 

class A 
{ 
    public: 
     virtual void f(int i) 
     { 
      cout << "A's f(int)!" << endl; 
     } 
     void f(int i, int j) 
     { 
      cout << "A's f(int, int)!" << endl; 
     } 
}; 

class B : public A 
{ 
    public: 
     virtual void f(int i) 
     { 
      cout << "B's f(int)!" << endl; 
     } 
}; 

int main() 
{ 
    B b; 
    b.f(1,2); 
    return 0; 
} 

내가 얻을 :

g++ -std=c++11 file.cpp 
file.cpp: In function ‘int main()’: 
file.cpp:29:9: error: no matching function for call to ‘B::f(int, int)’ 
file.cpp:29:9: note: candidate is: 
file.cpp:20:16: note: virtual void B::f(int) 
file.cpp:20:16: note: candidate expects 1 argument, 2 provided 

나는 B의 F (INT) 후 재 지정을 사용하려고 할 때, 나는이 같은 오류가 발생했습니다.

C++에서 단 하나의 메서드 만 재정의 할 수 있습니까? 내 컴퓨터에서 컴파일 할 코드를 찾고 override을 사용하여 코드 예제를 검색했습니다. 아직 찾지 못했습니다.

+0

[가상 메서드로 인해 파생 클래스에서 컴파일 오류가 발생할 수 있습니다] (http://stackoverflow.com/questions/7274723/virtual-method-causes-compilation-error-in-derived-class) –

+1

아니요, 죄송합니다. 그것은 또 다른 문제였습니다. –

+0

가능한 복제본 [C++ : 숨김 규칙의 근거] (http://stackoverflow.com/questions/4837399/c-rationale-behind-hiding-rule) – Angew

답변

5

메서드 이름으로 "f"이름을 재정의했습니다. 그래서 어떤 오버로드도 오버라이드 될 것입니다.

class B : public A 
{ 
    public: 
     using A::f; 
     virtual void f(int i) 
     { 
      cout << "B's f(int)!" << endl; 
     } 
}; 
10

문제는 클래스 B에서 가상 함수가 f() 숨 깁니다이다A의 동일한 이름을 가진 가상이 아닌 과부하. 당신은 범위에 그것을 가지고하는 using 선언을 사용할 수 있습니다

class B : public A 
{ 
    public: 
     using A::f; 
    // ^^^^^^^^^^^ 

     virtual void f(int i) 
     { 
      cout << "B's f(int)!" << endl; 
     } 
}; 
0

네,이 클래스의 한 메소드를 오버라이드 (override)는 가상하게 가능합니다. 비 가상 클래스는 상속 된 클래스에서 선언 될 때 섀도 잉됩니다.

4

당신은 이름 조회가 C++에서 어떻게 작동하는지에 물린있어 :

당신은 단지뿐만 아니라 기본 클래스를보고 컴파일러에게의 using 키워드를 사용할 수 있습니다. 컴파일러는 이름이 일치하는 항목이 하나 이상인 범위를 찾을 때까지 연속 범위를 검색합니다.

항목이 함수라고 가정하면 해당 범위에서 찾은 이름의 함수 중 오버로드를 수행합니다. 그러한 작품이 없으면 이 아니며은 더 나은 검색을 위해 더 많은 범위를 계속 검색합니다.

당신은, 그러나,이 경우 부모의 클래스를 검색 할 수 있습니다 :

class B : public A 
{ 
    public: 
     using A::f; 
     virtual void f(int i) 
     { 
      cout << "B's f(int)!" << endl; 
     } 
}; 

을 언뜻보기에, using 문이 모호함을 생산할 수 있다는 나타날 수 있습니다. 예를 들어, using A::f;을 사용하면 B의 범위 (A::f(int)B::f(int))에 두 개의f(int) 두 개의 함수가 표시되는 이 있습니다.C++에는이 문제를 다루기위한 몇 가지 규칙이 있습니다. 따라서 b.f(3);main (예 : using A::f;)에 추가하면 여전히 모호하지 않습니다. 예상대로 b::f(int)을 호출합니다.