我創建了一個矩陣類(主要用於自我實踐,我知道關於Eigen)。在其中,我有矩陣乘法定義爲人們所期望的 - 該方法接受對Matrix對象的const引用並返回Matrix對象。基類方法返回派生類objec
Matrix Matrix::operator *(const Matrix& rhs) const
{
Matrix temp(mRows,rhs.mCols);
... //do Matrix Multiplication
return temp;
}
然後我導出一個DCM類(方向餘弦矩陣 - 只是一種特殊的矩陣)。
class DCM: public Matrix
{
.... // class definition here, but does NOT contain definition for
// matrix multiplication
};
我可以創建兩個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對象而不必重新編寫派生類中的函數?一種方法是給這個構造添加到派生類:
DCM(const Matrix &M):Matrix(M) {}
,但似乎真的效率不高(爲乘法創建一個新的對象,然後拷貝製作DCM對象時)和限制(每次我乘2 DCM對象一起,我必須創建一個新的DCM對象,以便將Matrix對象複製到 - 我不能僅將返回的對象用作DCM)。有沒有辦法重用基類函數,但讓它返回派生類類型?
他們確實需要返回派生類型嗎?您的繼承層次結構已經暗示DCM是一個矩陣,並且規定兩者之間的乘法運算是相同的(即,它不必考慮DCM的特殊屬性),那麼返回就好了一個矩陣,儘管你可能想/需要一個轉換構造函數。 –
如果您將移動構造函數添加到Matrix類中,則「DCM Rvb_pq(Rvb_p * Rvb_q)'會更有效。 –
@TimoGeusch - 他們做的。我也推導出一個四元數類 - 你可以將一個DCM轉換爲四元數(我將要定義),但是通常把矩陣轉換爲四元數是沒有意義的。因此,這將允許我將兩個DCM相乘並將結果轉換爲四元數 –