2017-06-08 4 views
0

複数継承を理解するのに少し苦労しています。どうやら私は多重継承とダイヤモンド問題を持つ非常に複雑な問題を解決することを選択しました。たとえ私が私の問題に似ている2つのケース、例えばthis oneを見つけたとしても、私の質問は実行の順序よりもメモリ上にある。デフォルト以外のコンストラクタを使用した多重継承のメモリ割り当て

は、私は次のようしていると仮定します。私は、デフォルト以外のコンストラクタSymmPosDefオブジェクトを初期化する唯一の方法を与えているので

class Matrix { 
public: 
    Matrix(int rows, int Cols) { 
    // Build matrix of zeros 
    } 
}; 

class Symmetric : public virtual Matrix { 
public: 
    // It's enough to call Matrix constructor using the same number of rows and cols 
    Symmetric(int size) : Matrix(size, size) {} 
}; 

class PosDef : public virtual Matrix { 
public: 
    // We need different constructor, matrix of zeros is not pos def 
    PosDef(int size) { 
    // Build matrix of ones 
    } 
}; 

class SymmPosDef : public Symmetric, public PosDef { 
public: 
    // We basically want to use the PosDef constructor that gives symmetric matrix 
    SymmPosDef(int size) : Matrix(size, size), Symmetric(size), PosDef(size) {} 
}; 

を複雑チェーンSymmPosDef(int size) : Matrix(size, size), Symmetric(size), PosDef(size) {}であり、私の質問は、私がどのように多くの行列を構築していますか?

Symmetric(同じゼロ要素)に一度、PosDefに1回、同じスペースを再利用していますか?私はMatrixに1回スペースを割り当てますか?

行列のサイズが大きくなる可能性があるため、私はできるだけ少ない作業をしたいと考えています。

+0

多重継承を使用しないでください。 –

+0

@ RawNその後、対称性と正定性の関係を扱うための提案はありますか? – rodrigolece

+0

私は自由な関数と構成を言うでしょう。 – Jarod42

答えて

0

Matrixは、初期化された(初期化子リストから)最も派生したクラスで1回だけ初期化されます。 しかし、すべてのコンストラクタ本体が呼び出されます。あなたが持っているでしょう

class SymmPosDef : public Symmetric, public PosDef { 
public: 
    SymmPosDef(int size) : Matrix(size, size), Symmetric(size), PosDef(size) {} 
}; 

:付き

  • Matrix(size, size)
  • Symmetric(int size)体(/*Empty*/を)(Symmetric(int size) : Matrix(size, size)はスキップ)。
  • は(PosDef(int size) : Matrix(size, size))
  • PosDef(int size)体(/* Build matrix of ones */
  • SymmPosDef(int size)体(/*Empty*/)をスキップ。