私はマトリックスクラスを作成しています(主に自己課された練習のために、私はEigenについて知っています)。その中で、行列の乗算が期待どおりに定義されています。このメソッドは、Matrix オブジェクトへの const 参照を取り、Matrix オブジェクトを返します。
Matrix Matrix::operator *(const Matrix& rhs) const
{
Matrix temp(mRows,rhs.mCols);
... //do Matrix Multiplication
return temp;
}
次に、DCM クラス (Direction Cosine Matrix -- 特殊な種類の行列) を派生させます。
class DCM: public Matrix
{
.... // class definition here, but does NOT contain definition for
// matrix multiplication
};
2 つの DCM オブジェクトを作成し、それらを乗算することは問題ありませんが、返されるオブジェクトは Matrix 型です。
DCM Rvb_q(q);
DCM Rvb_p(p);
DCM Rvb_pq(Rvb_p*Rvb_q); // error because Rvb_p*Rvb_q returns a Matrix object
派生クラスで関数を再コーディングせずに、その関数が DCM オブジェクトを返すようにする方法はありますか? 1 つの方法は、このコンストラクターを派生クラスに追加することです。
DCM(const Matrix &M):Matrix(M) {}
しかし、それは非常に非効率的 (乗算用の新しいオブジェクトを作成し、DCM オブジェクトを作成するときにそれをコピーする) と制限 (2 つの DCM オブジェクトを乗算するときはいつでも、Matrix オブジェクト用の新しい DCM オブジェクトを作成する必要があるようです)にコピーされました-返されたオブジェクトを DCM として使用することはできませんでした)。基本クラス関数を再利用する方法はありますが、派生クラスの型を返すようにしますか?