0

次のコードでは:

#include <iostream>

class A
{
public:
    void f( float x ) { std::cout << 1; }
    void g() { std::cout << 11; }
};

class B : public A
{
public:
    void f( char x ) { std::cout << 2; }
    void g() { std::cout << 22; }
};

int main()
{
    B b;
    b.A::f( 0 );
    b.A::g();

    return 0;
}

この名前は隠れていませんか?そして、この構文は標準のどこで定義されていますか (C++11 または C++03 は関係ありません。両方の標準で同じようです)。

これが可能だとはまったく知りませんでした。そのような構文を見るのは初めてです(ここで初めて見ました:次のコードでクラス A 関数にアクセスできないのはなぜですか?

4

1 に答える 1

1

はい、名前隠しです。したがって、オーバーロードしていません(オーバーライドしていません)。のセクション13.2 Declaration matchingN3485これについて説明します。

13.2 Declaration matching

 1   Two function declarations of the same name refer to the same function if they are in
the same scope and have equivalent parameter declarations (13.1). A function member of
a derived class is not in the same scope as a function member of the same name in a base class. 

[ Example:


struct B {
int f(int);
};

struct D : B {
int f(const char*);
};
Here D::f(const char*) hides B::f(int) rather than overloading it.
void h(D* pd) {
pd->f(1); // error:
// D::f(const char*) hides B::f(int)
pd->B::f(1); // OK
pd->f("Ben"); // OK, calls D::f
}

--終わりの例]

于 2013-04-30T08:51:03.423 に答える