簡體   English   中英

C++中如何實現協變參數類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM