C++ C++;超载及;重写-无法初始化类型为'';具有类型为'';
我通常是一个C#guy,它处理得很好,很大程度上是在处理“最佳匹配”解析要调用的方法。我现在尝试在C++中做类似的事情,但是我正在编译错误。长话短说,它是方法重载和重写的组合 类栏:公共Foo{}//内容在这里并不重要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
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#的解析方式相同,不需要额外的语法来避免“名称隐藏”