2016-08-13 76 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 *' 

修復它是替換A中的方式::富(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)); 
    } 
};