【问题标题】:How is this possible in function hiding in C++? [duplicate]这怎么可能隐藏在 C++ 中的函数中? [复制]
【发布时间】:2020-03-07 13:25:58
【问题描述】:
我将不同类型的参数传递给 fun(),代码被编译,但打印“B 类”的相同函数仍在执行。不应该发生函数重载吗?
为什么会这样?
#include <iostream>
using namespace std;
class A
{
public:
void fun(int x)
{
cout<<"class A"<<endl;
}
};
class B: public A
{
public:
void fun (char c)
{
cout<<"Class B"<<endl;
}
};
int main()
{
B obj;
obj.fun('c');
obj.fun(3);
}
【问题讨论】:
标签:
c++
inheritance
overloading
【解决方案1】:
B::fun() 阴影A::fun() 和int 文字很容易转换为char,因此您的编译器可以轻松解决该调用。您可以将using A::fun; 添加到B 的定义中以使其可见。
【解决方案2】:
在编写obj.fun(<argument>) 时,首先会查找要调用的fun。由于编译器只先查看B,所以两次都找到B::fun(char),这就是被选中的。
如果没有一个参数成员函数,它只会查看A,因此B 中的fun 有效地将fun 隐藏在A 中。为了克服这个问题,你可以直接调用A的fun,比如:
obj.A::fun('c'); // A
static_cast<A&>(obj).fun('c'); // A
或者您可以使用 A::fun(int) 将其带入 B:
class B: public A
{
public:
using A::fun;
void fun(char c)
{
std::cout << "Class B\n";
}
};
obj.fun('c'); // B
obj.fun(3); // A
【解决方案3】:
你不能像这样在一个层次结构中超载。
名称查找发生在重载解析和访问控制之前。
一旦在 B 中找到函数名称,将不会检查层次结构中的其他类。因此,特定函数调用的所有候选函数都将是 B 中存在的函数。
您必须通过以下方式使 A 中的函数名称在 B 中可见:
using A::foo;
在 B 类中。
现在重载将按预期工作。