c++虚函数覆盖和重载

C++ Virtual Function Overriding and Overloading

本文关键字:重载 覆盖 函数 c++      更新时间:2023-10-16

我有以下的类结构:

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

我很难理解为什么这个演员是必要的,希望你能给我一些启发。我也不确定这是否能保证是一个安全的演员。

根据我的理解,在重载解析过程中,编译器应该选择需要对参数进行最少隐式强制转换的函数。但这里的情况似乎并非如此。

A::Foo隐藏IA::Foo

修复,使用using:

class A : public IA
{
public:
    using IA::Foo;
    void Foo(Y* y)
    {
        Foo(static_cast<X*>(y));
    }
};