55

这可能是一个菜鸟问题,对此感到抱歉。我最近在尝试处理 c++ 中的一些高级内容、函数重载和继承时遇到了一个奇怪的问题。

我将展示一个简单的例子,只是为了演示这个问题;

有两个类,classAclassB,如下所示;

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

它给出了错误,因为void func(char[]){}; 超类中的方法,classA在派生类中不可见,classB

我该如何克服呢?这不是 C++ 中重载的工作原理吗?我是 C++ 新手,但在 Java 中,我知道我可以使用这样的东西。

虽然我已经找到了这个询问类似问题的线程,但我认为这两种情况是不同的。

4

5 回答 5

71

您只需要一个using

class classB:public classA{ 
    public:
        using classA::func;
        void func(int){};
};

它不会搜索基类,func因为它已经在派生类中找到了一个。该using语句将另一个重载带入同一范围,以便它可以参与重载决议。

于 2013-01-08T09:49:48.577 回答
12

例如,在此问题的答案中对此进行了很好的解释:

为什么要使用“using”关键字来访问我的基类方法?

简而言之,当编译器在当前类中找到匹配的方法名称时,即使该方法不兼容,编译器也会停止从父类中搜索匹配的方法。我想这允许一些自动类型转换更合乎逻辑地工作,而无需覆盖这么多父类方法。

于 2013-01-08T09:53:47.327 回答
3

如果在派生类中覆盖函数的一个变体,则需要覆盖所有变体。您可以使用 JLledo 建议的内容,也可以在派生类中编写函数的变体,它只是调用具有相同签名的基类函数。

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
        void func(char[]){};
};

void classB:func(char[] ch)
{
    classA::func(ch);
}
于 2013-01-10T02:55:00.363 回答
1

所提出的解决方案提供了令人头疼的维护问题。将 ausing A::func注入派生类需要重新架构软件对使用放置在派生类中的子句敏感,也就是说,维护者不必自己更改基类,还必须更改派生类。假设我们从base<-derived1base<-derived2<-derived1。现在using base::func必须将 using 子句更改为using derived2::func,强制考虑 using 子句并增加维护成本。说这在 C++ 标准化工作中已经有很长一段时间了,但这并不能改变这个想法似乎构思不当。它打断了继承的概念。这只是我的想法。

于 2021-08-01T16:08:38.057 回答
-5

您必须将 int 类型的参数传入

objB.func(b);    //here's the problem!

bcs 它已被 int 参数重载

于 2014-02-13T08:51:05.760 回答