2012-02-21 14 views
2

私は同じ抽象スーパークラスから継承する2つのサブクラスを持っています。いくつかの属性に依存するすべてのサブクラスに共通の操作があります。私は例を挙げて説明しましょう:建設コールオーダー(C++)

class superClass 
{ 
    int valueA; 
    int valueB; 
    float* array; 

    public superClass(){ 
     array[valueA + valueB] 
    } 

    virtual foo(){ 
    } 

} 

そして、これらは私のサブクラスです:

が、これはスーパークラスA(Aは抽象的である)であると言う

class firstSubClass: superClass 
{ 

    public firstSubClass():superClass(), valueA(100),valueB(2){ 
    } 

    foo(){ 
    } 

} 

class secondSubClass: superClass 
{ 

    public secondSubClass():superClass(), valueA(50),valueB(3){ 
    } 

    foo(){ 
    } 

} 

配列が適切に初期化されますか?これは、スーパークラスの前に呼び出されるサブクラスのコンストラクタですか、それとも逆ですか?

初期化の動作を両方のサブクラスで共通にする方法は、スーパークラスに入れることですか?

ありがとうございます。

答えて

4

superClassのコンストラクタが最初に呼び出されます。

superClassコンストラクタは、独自のデータメンバを初期化し、superClass'sコンストラクタを呼び出す必要がありsuperClass'sデータメンバー とfirstSubClassを初期化するための責任を負わなければなりません。コンストラクタの呼び出し順序here

詳細情報とあなたもそう

hereコンストラクタ初期化子リストについてを読みたいかもしれませんが、私はよう superClassfirstSubClasssecondSubClassを定義します:私は理解している場合

class superClass 
{ 
    int valueA; 
    int valueB; 
    float* array; 

    public: 

    superClass(int a , int b): valueA(a),valueB(b) { 

     array = new float[valueA + valueB]; 
    } 
    virtual foo(){ 
    } 

} 



class firstSubClass: public superClass 
{ 

    public: 

    firstSubClass():superClass(100,2){ //calls superclass's constructor 
    } 

    foo(){ 
    } 

} 

class secondSubClass: public superClass 
{ 

    public : 

    secondSubClass():superClass(50 , 3){ 
    } 

    foo(){ 
    } 

} 
+0

これは意味があります。私はこれがあなた自身でそれを理解してしまわないように恥ずかしいと感じる場合の1つだと思います。ありがとう! –

+0

@kelmer、喜んで助けてください。上記の投稿が好きなら、それを親切に答え:Pとマークしてください。 – fizzbuzz

+0

完了、申し訳ありませんが、それを逃しました:) –

1

まあ、サブクラスのいずれかを構築しているときに、スーパークラスが浮動小数点配列を作成(初期化だけでなく)する必要があります。継承したクラスのインスタンスを作成する場合は、基本クラスのコンストラクタは、最初に起動され、あなたはそれにvalueAとVALUEB値を渡す必要があります - あなたは、コンストラクタの引数としてそれらを追加する必要があります。

superClass::superClass(int valueA, int valueB) : 
    valueA(valueA), valueB(valueB), array(0) 
{ 
    // now create an array of requested length - allocate memory for it 
    array = new float[valueA + valueB]; 
} 

// don't forget to deallocate memory for it (possibly in destructor) 
superClass::~superClass() 
{ 
    delete[] array; 
    array = 0; 
} 

を次に、あなたが継承されたのインスタンスを作成するときクラスでは、あなたはスーパークラスのコンストラクタのパラメータとしてvalueAとVALUEBを提供することができます。

firstSubClass::firstSubClass() : superClass(100, 2) 
{ 
    //... 
} 

サブクラスのコンストラクタの引数としてvalueAとVALUEBを追加するために、それは良いだろうので、ハードコードされた値(マジックナンバー)を使用することをお勧めではありません。

firstSubClass::firstSubClass(int valueA, int valueB) : superClass(valueA, valueB) 
{ 
    //... 
} 

最後に、配列を避ける必要があります。これはC++で、std::vector<float>を使用すると、はるかに安全で使いやすいです!

+0

本当に?私はいつも配列がベクトルより高速で効率的だったと思っていました。 –

+1

@kelmer - ベクトルは単純に配列のラッパーですが、物事はより簡単になりますが、効率は低いとは思われません。 –

+1

@kelmerエラーが発生しやすく、保守が難しい可能性のあるバグの高レベルと比較して、パフォーマンスの違いは存在しません。 –