タグ

継承に関するamagasa99のブックマーク (2)

  • 共変戻り値と反変引数 - Qiita

    C#を学習すると共変と反変という用語がでてきます。難しそうな用語ですが、その取っ掛かりとして戻り値と引数に的を絞って図によるイメージで説明します。数学的な知識は前提としませんし、コードも簡単なものしか出て来ません。型周りの知識を整理するのにも役立つでしょう。 この記事で最終的に説明したいことは、次のようにデリゲートから参照するメソッドの戻り値や引数の型を変える規則についてです。 C Foo(A a) { return new C(); } // 戻り値はBの派生クラスC、引数はBの基底クラスA delegate B Delg(B b); // 戻り値と引数ともにB Delg d = Foo; // 型が一致しないのに、なぜ許されるのか? この規則はイメージしにくく混乱を招きがちですが、図による直感的な説明を試みます。 ※ 具体例で用語に慣れることも目的としています。なるべく話を単純にするた

    共変戻り値と反変引数 - Qiita
  • C++ Labyrinth

    オーバーロードは継承できない これは、おそらく、C++ プログラマなら誰しも驚いた経験していることであり、 もし、あなたが未経験であってこの文章を読んで知識を仕入れておいたとしても、 きっといつかは体験して驚くことになるであろう、C++ の一仕様の話である。 いささか仰々しい書き出しになったが、今回の話題は、 「基底クラスと派生クラスで同じ名前の関数が定義されていた場合、 基底クラスの関数は隠されてしまう」という、C++ の仕様のことである。 ここで、「同じ名前なら隠されるのは当り前やんか」と思ったあなたは、 ちょっと読みが甘い。「同じ名前」というのは、文字通り、 「関数名だけが一致している」 ということであって、引数など、 シグネチャを構成する他の要素は違っていても構わないのだ。 例をあげよう。 class Base { public: int foo( int x ); }; clas

  • 1