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)