为什么在这种情况下无法访问基类的成员函数?

时间:2014-03-03 10:05:03

标签: c++ visual-studio-2010 visual-c++

我很困惑,为什么我无法访问void func(int i),任何人都可以帮助我? 当然,这只是一个帮助您轻松理解我的问题的演示。它真正的代码是巨大的,我希望Base和Child中的成员函数都可用。

输出始终是 **

double
2

**

        struct base
        {
            void func(int i)
            {
                cout << "int" << endl;
                cout << i << endl;
            }
        };

        struct child : base
        {
            void func(double d)
            {
                cout << "double" << endl;
                cout << d << endl;
            }
        };

        child c;
        c.func((int)2);

2 个答案:

答案 0 :(得分:3)

因为child::func 隐藏了 base::func

您需要通过将名称放在范围中来使其在派生类中可见:

struct child : base
{
    using base::func;
     void func(double d)
     {
         cout << "double" << endl;
         cout << d << endl;
     }
};

或通过在呼叫站点限定名称来明确调用基本版本:

c.base::func(2);

答案 1 :(得分:1)

从int到double的隐式转换掩盖了实际问题。如果将基类func参数类型从int更改为string:

struct base
{
    void func(string i)
    {
        cout << "string" << endl;
        cout << i << endl;
    }
};

然后您会收到以下错误以使其更清晰:

func.cpp: In function `int main()':
func.cpp:27: error: no matching function for call to `child::func(const char[13])'
func.cpp:17: note: candidates are: void child::func(double)

你可以看到它只有child :: func的可见性而不是base :: func