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

Posted

技术标签:

【中文标题】c++ 继承类中函数重载的问题【英文标题】:c++ issue with function overloading in an inherited class 【发布时间】:2012-12-22 03:22:57 【问题描述】:

这可能是一个菜鸟问题,对此感到抱歉。我最近在尝试处理 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;

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

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

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

【问题讨论】:

【参考方案1】:

您只需要一个using

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

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

【讨论】:

2020年现在还有更好的选择吗? @Raining,不,我认为不太可能会有。我不确定您指的是哪种替代方法,而不是更改名称查找,这不是一个有吸引力的前景。如果您甚至可以将其称为替代方案,则可以在基类中提供所有重载并一次将它们全部纳入范围。当在可变参数模板中使用时,这种技术可能很有用。除此之外,很难在如此笼统的层面上说——也许一些新的东西在更狭窄的背景下是有用的。也许您可以考虑将组合而不是继承作为一般选择。【参考方案2】:

例如在这个问题的答案中有很好的解释:

Why should I use the "using" keyword to access my base class method?

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

【讨论】:

感谢您的回答+链接。我想知道 C++ 人是否故意保留这个东西。有什么优点吗?我觉得这破坏了继承的想法,不是吗? @Sumudu:我可以给你一个绝对正确的想法,而且我认为7年后你不再关心:(来自语言规范)这是因为我们不希望改变基类影响派生类。【参考方案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);

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

你必须在

中传递int类型的参数
objB.func(b);    //here's the problem!

bcs 它已被 int 参数重载

【讨论】:

您可以尝试提供更详细的答案。

以上是关于c++ 继承类中函数重载的问题的主要内容,如果未能解决你的问题,请参考以下文章

C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数

C++深度剖析学习总结 22 类中的函数重载

C++深度剖析学习总结 22 类中的函数重载

在C++中,啥是运算符重载?啥是虚函数?

c++部分面试题

C++基础总结:C++ 类与对象初探——继承和重载