我有以下类结构:
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 :: Foo(Y *)替换为:
void Foo(Y* y)
{
static_cast<IA*>(this)->Foo(static_cast<X*>(y));
}
我很难理解为什么这个演员是必要的,并且会很感激一些见解。我不太确定这是否可以保证安全演员。
根据我在重载解析期间的理解,编译器应该选择对参数需要最少量隐式转换的函数。但这似乎并非如此。
答案 0 :(得分:2)
A::Foo
隐藏IA::Foo
要解决此问题,请使用using
:
class A : public IA
{
public:
using IA::Foo;
void Foo(Y* y)
{
Foo(static_cast<X*>(y));
}
};