スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]©2ch.net (467レス)
上下前次1-新
抽出解除 レス栞
12(2): 2016/09/01(木)12:44 ID:Cb20qd0C(1/2) AAS
Class A { int a }
Class B { int a }
Class C : A, B { } // A Bを継承
この状態だとCからaにアクセスする場合は
thisじゃどっちのaだよってなるから
A::a, B::aってやる必要があるけど
Class C { A a; B b; } // A Bを宣言
これと違う部分は
名前が衝突するかしないかだけ?
14(1): 2016/09/01(木)18:20 ID:9l469SL1(1/2) AAS
>>12
コンストラクタやデストラクタのタイミングから考えれば両者は別物
例えばCの初期化時、CのメンバがAやBにアクセスする場合
前者は問題なくCのメンバは初期化されるが
後者は宣言の位置によって未初期化データにアクセスする危険がある
前者はCをAとしてみることが出来るし、CをBとしてみることも出来る
でも後者においてCはCでしかない
例えばAを必要とする関数とBを必要とする関数がある場合、
前者はそのままCを引数に渡せるが後者は適宜メンバを指定しないといけない
もっともオーバーロードされた関数だとCをAかBにキャストしてやんないと曖昧だと怒られる
もちろん適切に宣言されていることは前提
15(1): 2016/09/01(木)18:26 ID:9l469SL1(2/2) AAS
>>12
>>14の補足
>後者は宣言の位置によって未初期化データにアクセスする危険がある
Cのメンバを初期化リストで初期化する場合の話ね
コンストラクタ本体部分でメンバに値を代入する場合なら、
Cのメンバはすでに初期化された後なので参照は可能
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.927s*