【问题标题】: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(&lt;argument&gt;) 时,首先会查找要调用的fun。由于编译器只先查看B,所以两次都找到B::fun(char),这就是被选中的。

    如果没有一个参数成员函数,它只会查看A,因此B 中的fun 有效地将fun 隐藏在A 中。为了克服这个问题,你可以直接调用Afun,比如:

    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 类中。

      现在重载将按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-15
        • 2012-04-03
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-25
        相关资源
        最近更新 更多