physpolyglot

主にPC関連の自分用メモのうち、役立ちそうなものを共有します。

C++でのクラスの継承とオーバーロードしたメンバ関数の隠蔽

オーバーロードしたメンバ関数のうち、 一部のメンバ関数だけオーバーライドできたら便利だなぁと思った。

#include <cstdio>

class Base {
public:
   void hoge(){
      printf("Base::hoge()\n");
      hoge(0);
   } 
   virtual void hoge(int){
      printf("Base::hoge(int)\n");
   }
};

class Derived : public Base {
public:
   using Base::hoge; //これがないとコンパイルが通らない
   void hoge(int){
      printf("Derived::hoge(int)\n");
   }
};

int main() {
   Derived d;
   d.hoge();

   return 0;
}

usingを除けばDerivedクラスでは二つのhogeのうちhoge(int)しか定義していない。
そうするとDerived::hoge()は隠されてしまうようで、Derived::hoge()は呼べなくなってしまうようだ。
子クラスでいちいちusingを書かなきゃいけないのは ユーザが簡単にクラスを用意できるという目的に反してしまうので(しかも原因がわかりにくい)、 実装ではオーバーロードはやめて名前の違う二つのメソッドを用意することにしました。

ちなみに上のコードを実行すると出力は下のようになりました。これは想定通り。

% ./a.out
Base::hoge()
Derived::hoge(int)