[英]How to achieve covariant parameter types in C++
我正在嘗試編寫一個矩陣類接口,然后為每種矩陣(例如行主、列主、稀疏版本等)創建特定的實現,問題是該接口使用 IMatrix 類定義了數學運算,但如果我在重寫方法中使用派生類,它只是無法編譯(因為我猜在 C++ 協變類型僅適用於返回類型,對嗎?)。
class IMatrix
{
int rows, cols, count;
public:
virtual ~IMatrix() = 0;
virtual IMatrix& plus(IMatrix& matrix) = 0;
};
class RMMatrix: public IMatrix // row-major matrix implementation
{
long double* data;
public:
~IMatrix() { delete[] data };
RMMatrix& plus(IMatrix& matrix) override // this works but then i cannot access matrix.data
{
// do addition
}
};
所以基本上我希望能夠使用這個函數簽名覆蓋:
RMMatrix& plus(RMMatrix& matrix) override // fails because function signature differs from IMatrix
正如我之前所說,我是 OOP C++ 的新手,我似乎無法找出在接口中不使用純虛擬的情況下強制實現類(例如 RMMatrix 和其他派生類)來定義這些方法的正確方法並且沒有 dynamic_cast =o 我想過使用模板,並將派生的實現類作為參數,但這感覺很奇怪 =s
我不確定,所以我只是將它發布在這里以確保這是否是基於@n.'pronouns'm
的反饋的有效答案(供其他人查看)。
template<class Derived>
class Matrix
{
int rows, cols, count;
public:
virtual Derived& plus(Derived& matrix) = 0;
};
class RMMatrix: public Matrix<RMMatrix>
{
long double* data;
public:
~RMMatrix() { delete[] data; };
RMMatrix& plus(RMMatrix& matrix) override
{
// do something
}
};
編輯:如評論中所述,由於 Matrix 不是抽象類,因此我可以刪除析構函數並正確編譯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.