Deprecated: Array and string offset access syntax with curly braces is deprecated in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/init.php on line 542
ja:cpp:class [GiriWiki]

ユーザ用ツール

サイト用ツール


ja:cpp:class

差分

この文書の現在のバージョンと選択したバージョンの差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
ja:cpp:class [2017/05/13 13:13]
kota [覚書]
ja:cpp:class [2017/05/28 18:09] (現在)
kota [覚書]
ライン 4: ライン 4:
  
 ===== 覚書 ===== ===== 覚書 =====
 +以下親クラス-子クラス、基底クラス-派生クラスという言葉がでてくるが、親<​->​基底、子<​->​派生で読み換え可。(混じってるだけ)
 +=== 継承とvirtual ===
 +  * 継承関係にある Base, Derived の2クラスが、同じ名前の関数func()を持っているとする。
 +  * Base *obj = new Derived()としたとき(ポリモーフィズム)
 +    * func()が親クラスでvirtualで宣言されている時  : Derived::​func() が呼び出される
 +    * func()が親クラスでvirtualで宣言されていない時 : Base::​func() が呼び出される
 +  * ポリモーフィズムを利用する場合は大概、派生クラスの関数のほうが呼ばれて欲しいだろうので、virtualで宣言すべきだろう
 +  * virtualでない場合、例えば親クラスの関数(子クラスでは再定義されていない)でfunc()を呼び出している場合、Derived *obj = new Derived() のようにしていたとしても、(親クラスの世界の中でfunc()をよびだしているので)Base::​func()が呼ばれてしまう。virtualで宣言しておけばDerived::​func()がちゃんと呼ばれる。
 +  * あえて基底クラスのほうのfunc()を呼びたければ、スコープ解決演算子を使ってBase::​func() と明示的に指定して呼び出せばよい。
 +
 +
 === 親クラスでコンストラクタの中で仮想関数を使うのは危険 === === 親クラスでコンストラクタの中で仮想関数を使うのは危険 ===
   * 継承した子クラスのコンストラクタが呼ばれた時、親クラスのコンストラクタ->​子クラスのコンストラクタという順で呼ばれる。   * 継承した子クラスのコンストラクタが呼ばれた時、親クラスのコンストラクタ->​子クラスのコンストラクタという順で呼ばれる。
ライン 12: ライン 23:
   * Initialize() みたいな関数を作った時など注意したほうがいいかも。   * Initialize() みたいな関数を作った時など注意したほうがいいかも。
  
-=== (仮想メンバ関数をもつ)親クラスのでコンストラクタはvirtualでなくてはならない===+=== (仮想メンバ関数をもつ)親クラスのでストラクタはvirtualでなくてはならない===
   * ポリモーフィズムを利用する(Parent *obj = new Daughter() のように使う)ことを想定   * ポリモーフィズムを利用する(Parent *obj = new Daughter() のように使う)ことを想定
   * デストラクタが virtual でない場合、親クラスの型のポインタを delete した際には親クラスのデストラクタしか呼ばれない   * デストラクタが virtual でない場合、親クラスの型のポインタを delete した際には親クラスのデストラクタしか呼ばれない
ja/cpp/class.1494681204.txt.gz · 最終更新: 2017/05/13 13:13 by kota