2017-04-25 52 views
1

我通常是一个C#人,它处理这个问题,主要是在处理“最佳匹配”呼叫。我现在试图在C++中做类似的事情,但是得到一个编译错误。长话短说,这是方法超载覆盖的组合。C++ Overload&Override - 无法初始化类型为''的参数,类型为'''

Bar类:公共富{} //内容并不真正的问题在这里

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*' 

所以,它试图解决对的方法Derived的方法,而不是承认的基类实现一个有效的匹配。再次,C#找到基本方法。 C++不能这样做,还是我错过了一些东西?

回答

4

派生类中的函数隐藏了任何在基类中具有相同名称的函数(即使您重写了虚函数)。要取消隐藏其他过载,请使用“using”声明:

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

TIL,谢谢。目前我正在使用手机,但Java是否以同样的方式工作? – Qix

+0

Java在此解析方式与C#相同,因此不需要额外的语法来避免“名称隐藏”。 –

相关问题