クラスを継承する場合, コンストラクタ関数やデストラクタ関数は, 基本クラスや派生クラスの両方に含めることができる.
両方のクラスにコンストラクタが定義されている場合, まず,基本クラスのコンストラクタが実行され,ついで, 派生クラスのコンストラクタが実行される.
逆に,デストラクタは,まず,派生クラスのデストラクタが実行され, ついで基本クラスのコンストラクタが実行される.
class circle { protected: float radius; /* 半径 */ public: circle(float r) { radius = r; } ... }; class disc: protected circle { float thickness; /* 厚さ */ float volume; /* 体積 */ public: disc(float t, float r): circle(r) { thickness = t; volume = t * r * r * 3.14; } ... };
上の例では,
派生クラス disc
でコンストラクタを定義している.
その定義 disc(float t, float r): circle(r)
において,
circle(r)
は,基本クラスのコンストラクタに
渡す引数を示す.
問題 3-3 縦,横の長さと面積を 被保護メンバの変数として持つ長方形を表すクラスと, その派生クラスで, 縦,横,高さの長さと体積を 変数として持つ直方体を表すクラスを 定義せよ. 直方体のクラスのオブジェクトは, 生成時に,コンストラクタの引数として縦,横,高さの値を指定するものとする. (教科書 p.242 の 5. 参照)