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