当我学习函数重载时,我知道函数的名称和参数个数与另一个函数不同。所以我尝试类似的继承。
我在基类中声明了一个没有参数的函数,并使用相同的名称但在派生类中使用不同数量的参数来声明另一个函数。
从我的函数重载和继承知识,主代码应该工作,但事实证明基类中的函数不是继承的,我必须显式调用它。
有人可以向我解释一下这种行为吗?不应该呼吸()被派生类继承吗?非常感谢。
#include <iostream>
using namespace std;
//base class
class animal {
public:
void breathe(){
cout << "animal breathe" << endl;
}
};
//derived class
class fish: public animal {
public:
void breathe(int a){
cout << "fish bubble" << endl;
}
};
int main() {
fish fh;
// correct
fh.breathe(1);
// correct
fh.animal::breathe();
// error
fh.breathe();
return 0;
}
答案 0 :(得分:0)
n3376 10.2 / 3-4-5
C中f的查找集,称为S(f,C),由两个组件组成 sets:声明集,一组名为f的成员;和子对象 set,一组子对象,其中声明了这些成员(可能 发现包括使用声明在内。 在声明集中, using-declarations由他们指定的成员替换,和 类型声明(包括inject-class-names)被替换为 他们指定的类型。 S(f,C)计算如下:
<强>&GT;如果C包含名称为f的声明,则声明集 包含在C中声明的满足f的每个声明 查找发生的语言构造的要求。如果 生成的声明集不为空,子对象集包含 C本身,计算完成。
<强>&GT;否则(即C不包含f或f的声明) 结果声明集为空),S(f,C)最初为空。如果是C. 有基类,计算每个直接基数中f的查找集 class subobject B i,并合并每个这样的查找集S(f,B i) 变成S(f,C)。
在您的情况下,类breathe
中有函数fish
,编译器不会尝试在基类中找到breathe
。您可以通过在派生类中显式插入using
声明来解决此问题。
using animal::breathe;
现在,编译器有两个变量,并且将调用到期重载分辨率animal::breathe
。
答案 1 :(得分:0)
Google方法隐藏。添加
using animal::breathe;
分类鱼
答案 2 :(得分:0)
fh.breathe();
是一条错误消息,因为派生类中定义了另一个breathe()
,它有效地隐藏基类中定义的breathe()
。
您可以通过添加语句来更正此问题:
using animal::breathe;
在班级fish
。
修改后的fish
类:
class fish: public animal {
public:
//Make sure to make this statement public
//otherwise animal::breathe will not be accessible
//to the object of fish.
using animal::breathe;
void breathe(int a){
cout << "fish bubble" << endl;
}
};
答案 3 :(得分:0)
当您在派生类中声明一个与基类同名的函数时,您将隐藏基类函数。要在派生类范围内引入基类函数,必须使用using animal::breath
显式指定它,如下所示:
class fish: public animal {
public:
using animal::breath;
void breathe(int a){
cout << "fish bubble" << endl;
}
};