继承类中函数重载的c++问题
c++ issue with function overloading in an inherited class
这可能是个小问题,很抱歉。最近,当我试图处理c++中的一些高级内容、函数重载和继承时,我遇到了一个奇怪的问题。
我将展示一个简单的例子,只是为了演示问题;
有两个类,classA
和classB
,如下所示;
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<-derived1
到base<-derived2<-derived1
。现在,使用条款using base::func
必须改为using derived2::func
,这迫使人们考虑使用条款,并增加了维护成本。说这已经在C++标准化工作中进行了很长一段时间,并不能改变这个想法似乎是构思不周的。它打断了继承的概念。只是我的想法。
您必须在中传递int类型的参数
objB.func(b); //here's the problem!
bcs它已被int参数重载
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- C++格式化输出问题
- 使用mongocxx驱动程序时包含头文件问题