どこかのだれかへ

職業ゲームプログラマ。気になったニュースのピックアップや開発日記などを書いています。

基底クラスメンバ関数のオーバーロードによる名前隠蔽

今更ながら知った仕様なんですが、基底クラスのメンバ関数オーバーロードした場合、基底クラスのメンバ関数は隠蔽されてしまいます。

class Base{
public:
    void Hello(){}
};

class Derived : public Base{
public:
    void Hello(int){}
};

void main()
{
    Derived derived;
    derived.Hello(); // ビルドエラー
}

この場合、usingで基底メンバ関数を指定するか、ポリモーフィズムによって使用可能になります。下記はusingを使う場合の例です。

class Derived : public Base{
public:
    using Base::Hello;
    void Hello(int){}
};