オーバーロードされた関数のオーバーライド

多重定義されているメンバ関数をオーバーライドするときは、多重定義されているすべてのメンバ関数をオーバーライドしなければならない。
ってこと? ちょっとにわかには信じられない。これが事実だとしたら、メンバ関数の多重定義はやるなっていってるのとおんなじじゃん。

おぉ、本当だ。GCC-4.0 と VS2005 の両方でエラーになる。なんか検索順序の違う名前空間に属する関数はオーバーロードにならないらしい。つまり Derived::getValue を検索して、引数がマッチしない時点でエラーになって、Base::getValue までは探してくれないと。
要するに、こんなのもエラーになる。

namespace foo {
    int value = 10;

    int getValue() {
        return value;
    }
}

namespace bar {
    using namespace foo;

    void getValue(int *out) {
        *out = getValue();
    }
}

で、解決策としては Derived の定義を

class Derived : public Base {
public:
    Derived(int value) : Base(value) {}
    virtual ~Derived() {}
    virtual void getValue(int* out) { *out = value; }
    using Base::getValue;
};

usingを追加すればいいみたい。上の namespace の例は using namespace foo;using foo::getValue; にすればいい。
しかし、なんでこんな仕様なんだ。

追記

うわ、すごい勢いでかぶった。エントリ書きはじめる前(というか大学に来る前)には見たときは無かったのにー。いやマジで。
まぁ、微妙に違うことも書いてあるからありということで。
関係ないけど、12月に入ってから「ときどきの雑記帳」の各エントリに張ってある Permalink がおかしくないですか?