这可能是一个很难回答的问题,很抱歉。我最近遇到了一个奇怪的问题,当我试图在C++中处理一些高级的东西时,函数重载和继承。
我将展示一个简单的例子,只是为了演示问题;
有两个类,classA
和classB
,如下所示;
class classA{
public:
void func(char[]){};
};
class classB:public classA{
public:
void func(int){};
};
据我所知,classB
现在应该有两个func(..)
函数,由于不同的参数而被重载。
但在main方法中尝试这一点时;
int main(){
int a;
char b[20];
classB objB;
objB.func(a); //this one is fine
objB.func(b); //here's the problem!
return 0;
}
它给出了错误,因为超类ClassA
中的方法void func(char[]){};
在派生类ClassB
中不可见。
我怎样才能克服这些呢?在C++中重载不就是这样工作的吗?我是C++新手,但在Java,我知道我可以利用这样的东西。
虽然我已经找到了这条线索,它询问了一个类似的问题,但我认为这两个案例是不同的。
您所需要的只是使用:
class classB:public classA{
public:
using classA::func;
void func(int){};
};
它不在基类中搜索func
,因为它已经在派生类中找到了一个。using
语句将另一重载带入同一作用域,以便它能够参与重载解析。
这个问题的答案就很好地解释了:
为什么我要使用“using”关键字访问我的基类方法?
简而言之,当编译器在当前类中找到匹配的方法名称时,即使该方法不兼容,也会停止从父类类中搜索匹配的方法。我猜这允许一些自动类型转换更符合逻辑地工作,而不需要重写那么多父类方法。