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を返すはずintですが、何も返さないことに注意してください。

C++11 標準のパラグラフ 6.6.3/2 によると、何も返さずに値を返す関数の末尾から外れることは未定義の動作です。

于 2013-06-10T19:21:18.227 に答える