1

下面的代码有什么问题?

  class B
{
public:
    int test()
    {
        cout<<"B:test()"<<endl;
        return 0;
    }
    int test(int i)
    {
        cout<<"B test(int i)"<<endl;
        return 0;
    }
};

class D: public B
{
public:

    int test(char x) { cout<<"D test"<<endl; return 0; }
};

int main()
{
    D d;
    d.test();
    return 0;
}
4

3 回答 3

4

问题是名称隐藏test()派生类中的函数D 隐藏test()了基类中的重载B,因此表达式中的重载决议不会考虑这些重载:

d.test()

只需添加一个using声明:

class D: public B
{
public:
    using B::test;
//  ^^^^^^^^^^^^^^
    int test(char x) { cout<<"D test"<<endl;}
};

另请注意,您test()在基类B中的重载应该返回 an int,但它们什么也不返回。

根据 C++11 标准的第 6.6.3/2 段,从返回值函数的末尾而不返回任何内容是未定义的行为

于 2013-06-10T19:21:18.227 回答
3

这是教科书式的隐藏案例

于 2013-06-10T19:23:27.647 回答
2
d.test();

将不起作用,因为您的派生类test(char)隐藏了所有基类函数,如果您执行上述操作,将不会调用匹配的函数。

于 2013-06-10T19:23:44.647 回答