さり海馬

Thoughts walk away, blog stays.

知らなかったよ:オーバーロードは継承できない

たまには仕事に関係あることを書いてみよう(笑)。

恥を覚悟で書く、先日ひどく悩んだこと。

  • ベースクラス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

*1:シグネチャが違ってても関係ねぇ