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));
}
我很難理解爲什麼這個演員是必要的,並希望有一些見解。我不太確定這是否能保證演員安全。
爲了我的理解,在重載解析期間,編譯器應該選擇對參數要求最少量隱式轉換的函數。但這似乎並不是這種情況。