下面的程序在父类和子类中包含两个show()函数,但是第一个show()函数接受FLOAT参数,第二个show()函数接受INT参数。
。如果我通过传递float参数调用show(10.1234)函数,它应该调用类A的show(float a)函数,但它调用类B的show(int b)。
#include<iostream>
using namespace std;
class A{
float a;
public:
void show(float a)
{
this->a = a;
cout<<"\n A's show() function called : "<<this->a<<endl;
}
};
class B : public A{
int b;
public:
void show(int b)
{
this->b = b;
cout<<"\n B's show() function called : "<<this->b<<endl;
}
};
int main()
{
float i=10.1234;
B Bobject;
Bobject.show((float) i);
return 0;
}
输出:
B's show() function called : 10
预期产出:
A's show() function called : 10.1234
为什么g ++编译器选择了错误的show()
函数,即class B
的{{1}}函数?
答案 0 :(得分:12)
如果在派生类中有一个与基类中的函数同名的函数,它会隐藏基类中的所有函数。您需要重命名函数,或在派生类中使用using声明:
using A::show;
或者,您可以显式调用基类函数:
Bobject.A::show(i);
答案 1 :(得分:1)
这里没有涉及多态性。您应该声明函数virtual
以使它们具有多态性,并使它们具有相同的签名。
答案 2 :(得分:1)
使用using
声明。
class B : public A{
int b;
public:
using A::show;
…
};
答案 3 :(得分:1)
你在混合东西:
如果您在class A
中有2个具有以下签名的功能:
void Show(int a);
void Show(float a);
然后编译将选择“正确”的功能。
答案 4 :(得分:1)
在派生类中定义名称时,它会隐藏基类中的名称。
您可以通过将此添加到B的定义来实现您想要的目标:
using A::show;
这将让你同时使用A的show()和B的show()。