知らなかったよ:オーバーロードは継承できない
たまには仕事に関係あることを書いてみよう(笑)。
恥を覚悟で書く、先日ひどく悩んだこと。
- ベースクラスBaseに既存のメソッドvoid method(int i)があります。
- それを継承してDelivedクラスを作り、そこに既存のメソッドと同名だけどもシグネチャ(今回は引数の型)が違うメソッド void method( char a )を作ります。
- Delived クラスのインスタンスを生成して、『Baseを継承してるから Baseクラスのmethod(int i) を使ってぇ…』とか考えます。
- コンパイラが「int を char に変換して使ったら危ないかもよ?」みたいなことを言いやがります。どうやら method(char a)の方を呼んでるらしいです。
えええ…と思っていろいろ調べてみると、C++の言語仕様で「ベースと同じ名前*1のメソッドは継承した側のクラスから見えません」ってなってました。
…知らなかったよ。
詳細と回避方法はこちら→ http://www.fides.dti.ne.jp/~oka-t/cpplab-hide-overload.html