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));
    }
};