落穂拾い(これまでに出た質問とか)
12月23日辺り 授業内容
多重継承 多重継承でも、通常の継承の時とルールは変わらない。 ・public継承をすると、publicメンバは継承先でどのようなアクセス制限になるっけ? ・public継承をすると、privateメンバは継承先でどのようなアクセス制限になるっけ? ・public継承をすると、protectedメンバは継承先でどのようなアクセス制限になるっけ? コンストラクタ 継承先から、継承元のコンストラクタを呼べるし、引数も渡せるよ。 どうやるんだっけ? デストラクタ コンストラクタの名前に~(チルダ)を付けるとデストラクタになる。 引数も、戻り値も持てない特別なメンバ オブジェクトが「破棄」されるときに呼ばれる 何も書かないと、何もしないデフォルトが生成される 継承を重ねた時に、コンストラクタとデストラクタが呼ばれる順番を確認しよう 悲報:明日はクリスマス
質問
包含関係がよくわからなかった。
よくある解答
- is-a関係
- 継承関係 : サブクラス is a スーパクラス。
- has-a関係
- 包含関係 : 全体クラス has a 部分クラス。
例えば、昨日あたりやったRPGのキャラクターを考える。 主人公のクラスは以下の通りだった。
主人公(cChara) setter getter constructorも欲しいね 属性(メンバ変数) ・名前(string) ・腕力 (int) ------------------------- 機能(メンバ関数) ・名乗る(自己紹介) 表示のみ ↓ ・戦う(なぐる) ・防御(身を守る) ・逃げる(逃亡) ・特殊攻撃(オーバーライド用 職業別攻撃) =0 で純粋仮想関数になるよ ------------------------- →戦士(cWarrior) ・特殊攻撃はない →魔法使い(cWizard) ・魔法(魔力で攻撃) →盗賊(cThief) ・ぬすむ(戦士から金を盗む)
この構成で行くと以下のように解釈できる。
- 主人公には3つの職業がある
- 戦士、魔法使い、盗賊 は職業である。
- 主人公には、名前、腕力、のパラメータがある
主人公に関しては、
- 主人公は名前を持っている
- 主人公は腕力のパラメータを持っている
(~は~を持っている。なのでhas-a関係)
と言える。
has-aの時は~は~を持っているという包含関係であり、
メンバ変数としてクラス内に持った方が自然な形になることが多い。
つまりここで職業に関しては、
- 戦士は主人公である
- 魔法使いは主人公である
- 盗賊は主人公である
(~は~である。なので、is-a関係)
と、言える。
is-aの時は~は~である。という継承関係にあるので、
主人公を継承した各職業のクラスを設計する方が自然な形になることが多い。
—
継承はいくつあっても重くなったりしないのか
そんなには気にする必要はないけれども、メンバが肥大化してくると、
当然1個のインスタンス当たりのメモリ占有料が増えるので非効率になります。
使わないメンバとか、使うかもしれないから増やしておこう、という拡張の仕方はよくないです。
—
新しい機能を追加するときのプログラムについて呼び出した後のところがよくわかりませんでした
機能=メンバ関数を追加したときは、publicなメンバ関数であれば、そのままインスタンス名.関数名で呼び出せます。
引数あるときは、引数付けます。