c++ 继承类中函数重载的问题
Posted
技术标签:
【中文标题】c++ 继承类中函数重载的问题【英文标题】:c++ issue with function overloading in an inherited class 【发布时间】:2012-12-22 03:22:57 【问题描述】:这可能是一个菜鸟问题,对此感到抱歉。我最近在尝试处理 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 中,我知道我可以使用类似的东西。
虽然我已经找到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++ 继承类中函数重载的问题的主要内容,如果未能解决你的问题,请参考以下文章