C ++虚函数重写和重载

时间:2016-08-13 22:35:16

标签: c++ polymorphism overloading

我有以下类结构:

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

我很难理解为什么这个演员是必要的,并且会很感激一些见解。我不太确定这是否可以保证安全演员。

根据我在重载解析期间的理解,编译器应该选择对参数需要最少量隐式转换的函数。但这似乎并非如此。

1 个答案:

答案 0 :(得分:2)

A::Foo隐藏IA::Foo

要解决此问题,请使用using

class A : public IA
{
public:
    using IA::Foo;

    void Foo(Y* y)
    {
        Foo(static_cast<X*>(y));
    }
};