2016-08-13 2 views
0

나는 다음과 같은 클래스 구조가 과부하 :C++ 가상 함수 재정 및

class X 
{ 
    // ... 
}; 

class Y : public X 
{ 
    // ... 
}; 

class IA 
{ 
public: 

    virtual void Foo(X* x) = 0; 
}; 

class A : public IA 
{ 
public: 

    void Foo(Y* y) 
    { 
     Foo(static_cast<X*>(y)); 
    } 
}; 

class B : public A 
{ 
public: 

    virtual void Foo(X* x) override 
    { 
     // ... 
    } 
}; 

그러나,이 코드가 생성하는 컴파일러 오류 :

error C2664: 'void A::Foo(Y *)': cannot convert argument 1 from 'X *' to 'Y *' 

그것은을 대체하는 것입니다 해결하는 방법 :: 푸 (Y *)는 다음과 같습니다.

void Foo(Y* y) 
{ 
    static_cast<IA*>(this)->Foo(static_cast<X*>(y)); 
} 

이 캐스트가 필요한 이유를 이해하는 데는 많은 어려움이 있습니다. 이것이 안전한 주조가 될 수 있는지 확실하지 않습니다.

과부하 해결 중에 필자의 이해를 돕기 위해 컴파일러는 매개 변수의 암시 적 캐스팅을 최소화하는 기능을 선택해야합니다. 그러나 그것은 여기에있는 것처럼 보이지 않습니다.

답변

2

A::Foo가 그것을 해결하기 위해 IA::Foo

을 숨 깁니다, 사용 using :

class A : public IA 
{ 
public: 
    using IA::Foo; 

    void Foo(Y* y) 
    { 
     Foo(static_cast<X*>(y)); 
    } 
};