C++ C++;超载及;重写-无法初始化类型为'';具有类型为'';

C++ C++;超载及;重写-无法初始化类型为'';具有类型为'';,c++,overloading,overriding,C++,Overloading,Overriding,我通常是一个C#guy,它处理得很好,很大程度上是在处理“最佳匹配”解析要调用的方法。我现在尝试在C++中做类似的事情,但是我正在编译错误。长话短说,它是方法重载和重写的组合 类栏:公共Foo{}//内容在这里并不重要 class Base { public: virtual void Do(Foo* foo) { } virtual void Do(Bar* bar) { } }; class Derived : public Base { public: virtua

我通常是一个C#guy,它处理得很好,很大程度上是在处理“最佳匹配”解析要调用的方法。我现在尝试在C++中做类似的事情,但是我正在编译错误。长话短说,它是方法重载和重写的组合

类栏:公共Foo{}//内容在这里并不重要

class Base
{
public:
    virtual void Do(Foo* foo) { }
    virtual void Do(Bar* bar) { }
};
class Derived : public Base
{
public:
    virtual void Do(Bar* bar) { }
}


Foo* foo = new Foo();
Derived* d = new Derived();
d->Do(foo); //cannot initialize a parameter of type 'Bar*' with an rvalue of type 'Foo*'

因此,它尝试仅针对
派生的
中的方法解析方法,而不是识别基类实现有效匹配。同样,C#找到了基本方法。C++不能这样做,还是我缺少了什么?

< p>在派生类中的函数隐藏了基类中的同名函数(即使您重写了一个虚函数)。要取消隐藏其他重载,请使用“
using
”语句:

class Derived : public Base
{
public:
    virtual void Do(Bar* bar) { }
    using Base::Do;
};

派生类中的函数隐藏基类中任何同名的函数(即使覆盖虚拟函数)。要取消隐藏其他重载,请使用“
using
”语句:

class Derived : public Base
{
public:
    virtual void Do(Bar* bar) { }
    using Base::Do;
};

直到,谢谢。我现在正在打电话,但Java的工作方式是否相同?在这方面,Java与C#的解析方式相同,不需要额外的语法来避免“名称隐藏”。直到,谢谢。我现在正在打电话,但Java的工作方式是否相同?在这方面,Java与C#的解析方式相同,不需要额外的语法来避免“名称隐藏”