オーバーロードされた関数のオーバーライド
多重定義されているメンバ関数をオーバーライドするときは、多重定義されているすべてのメンバ関数をオーバーライドしなければならない。
ってこと? ちょっとにわかには信じられない。これが事実だとしたら、メンバ関数の多重定義はやるなっていってるのとおんなじじゃん。
おぉ、本当だ。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 がおかしくないですか?