使用/不使用参数派生基类函数

时间:2013-06-10 19:20:04

标签: c++ class inheritance overloading method-overriding

以下代码有什么问题?

  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;
}

3 个答案:

答案 0 :(得分:4)

问题是名称隐藏。派生类test() 中的函数D隐藏<{1}}基类test()中的重载

B

只需添加d.test() 声明:

using

另请注意,基类class D: public B { public: using B::test; // ^^^^^^^^^^^^^^ int test(char x) { cout<<"D test"<<endl;} }; 中的test()重载应该返回B,但它们不返回任何内容。

根据C ++ 11标准的第6.6.3 / 2段,在没有返回任何内容的情况下从值返回函数的末尾掉下来是未定义的行为

答案 1 :(得分:3)

答案 2 :(得分:2)

d.test();

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