C++ 虚函数覆盖和重载
C++ Virtual Function Overriding and Overloading
我有以下 class 结构:
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));
}
我无法理解为什么需要进行此转换,希望能提供一些见解。我也不太确定这是否保证是安全的。
根据我的理解,在重载解析期间,编译器应该 select 需要最少数量的参数隐式转换的函数。但这里似乎不是这样。
A::Foo
隐藏 IA::Foo
要修复它,请使用 using
:
class A : public IA
{
public:
using IA::Foo;
void Foo(Y* y)
{
Foo(static_cast<X*>(y));
}
};
我有以下 class 结构:
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));
}
我无法理解为什么需要进行此转换,希望能提供一些见解。我也不太确定这是否保证是安全的。
根据我的理解,在重载解析期间,编译器应该 select 需要最少数量的参数隐式转换的函数。但这里似乎不是这样。
A::Foo
隐藏 IA::Foo
要修复它,请使用 using
:
class A : public IA
{
public:
using IA::Foo;
void Foo(Y* y)
{
Foo(static_cast<X*>(y));
}
};