继承类中函数重载的c++问题

c++ issue with function overloading in an inherited class

本文关键字:c++ 问题 重载 函数 继承      更新时间:2023-10-16

这可能是个小问题,很抱歉。最近,当我试图处理c++中的一些高级内容、函数重载和继承时,我遇到了一个奇怪的问题。

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

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

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

据我所知,classB现在应该拥有两个func(..)函数,由于参数不同而过载。

但在尝试主要方法时;

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中,我知道我可以利用这样的东西。

虽然我已经找到了这个关于类似问题的帖子,但我认为这两种情况不同。

您只需要一个using:

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

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

这在这个问题的答案中得到了很好的解释:

为什么我应该使用";使用";关键字来访问我的基类方法?

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

如果覆盖派生类中函数的一个变体,则需要覆盖所有变体。您可以使用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);
}

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

您必须在中传递int类型的参数

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

bcs它已被int参数重载