継承について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大工

継承について

#1

投稿記事 by 大工 » 16年前

質問内容が違うので新しいトピを立てさせていただきます.

test2 の引数ありコンストラクタでオブジェクトを生成すると test1 のデフォルトコンストラクタが起動しますが,下記のように動的割り当てを行っている場合,損をしていますよね?(多分・・・・環境にもよるんでしょうが・・・100 個の配列を用意してもtest2で50 個の配列を新しく指すようにしているので100個の配列分の領域が残ってるから・・・・・

この損を無くして,うまく制御するというか・・・test2のオブジェクトの生成時に意図的にtest1のデフォルトコンストラクタを起動させないような感じの仕組みはありますか?やはり,test2の引数ありコンストラクタでdeleteを行うしか手はないのでしょうか?
#include<iostream>

class test1 {

	protected:

		int* data;
		int i;
		int j;

	public: 

		test1() : i(0), j(2) {data = new int[100];}
};

class test2 : public test1 {

	private:

		int x, y;

	public:

		test2() : x(0), y(2) {}
		test2(int sz) {data = new int[sz];}
};

int main(void) {

	test2 ts2(50);

	return 0;
}

Justy

Re:継承について

#2

投稿記事 by Justy » 16年前

 test1の別のコンストラクタを用意して、そっちを使えばいいかと思います。
 例えば、こんなかんじで。
[color=#d0d0ff" face="monospace]
class test1 {

    protected:

        int* data;
        int i;
        int j;

    public: 

        test1() : i(0), j(2) {data = new int[100];}
        test1(int sz) : i(0), j(2) {data = new int[sz];}

};

class test2 : public test1 {

    private:

        int x, y;

    public:

        test2() : x(0), y(2) {}
        test2(int sz): test1(sz) {}
};[/color]
 基底クラスのメンバは基底クラスに任せるのが一番かと。

大工

Re:継承について

#3

投稿記事 by 大工 » 16年前

なるほど!そんな書き方があったんですね!

test2() : x(0), y(2) {}<-ですが,test2() : x(0), y(2), i(0){} とすると
test.cpp: In constructor ‘test2::test2()’:
test.cpp:24: error: class ‘test2’ does not have any field named ‘i’
とエラーが出ました.

なぜでしょうか?ちゃんと継承しているはずなのに・・・・・・

Justy

Re:継承について

#4

投稿記事 by Justy » 16年前

 いや、test2のメンバに iはないので、コンストラクタの初期化子では初期化できません。

 test2()のコンストラクタの中で任意の値で test1の iを初期化したいのなら
test1のコンストラクタの引数として値を渡して test1に初期化してもらうか、
test2のコンストラクタの {} 内で初期化するしかないです。

大工

Re:継承について

#5

投稿記事 by 大工 » 16年前

なるほど,ありがとうございます.

閉鎖

“C言語何でも質問掲示板” へ戻る