2012-03-07 113 views
0

在計算機視覺庫,基類DescriptorExtractor(用於在一個圖像中從關鍵點提取描述符)是這樣寫的是:虛擬功能

class DescriptorExtractor 
{ 
public: 
    virtual ~DescriptorExtractor(); 
    void compute(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const; 
protected: 
    virtual void computeImpl(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const = 0; 
}; 

而對於不同類型的描述符,如篩的衝浪,我們從基類派生:

class SurfDescriptorExtractor : public DescriptorExtractor 
{ 
public: 
    SurfDescriptorExtractor(..){..} 
protected: 
    virtual void computeImpl(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors) const; 
    SURF surf; 
}; 

並且受保護的方法computeImpl被(重新)實現。 我寫了一個新的描述符提取MyDescriptorExtractor這需要當前圖像(如他人的OpenCV)和以前的形象太像(?):

class MyDescriptorExtractor: public DescriptorExtractor 
{ 
public: 
    ... 
protected: 
    virtual void computeImpl(const Mat& image, const Mat& prev_image, vector<KeyPoint>& keypoints, Mat& descriptors) const; 
} 

我希望這個新類是使用DescriptorExtractor作爲參數OpenCV的方法兼容。做這個的最好方式是什麼 ?問題是,基類方法compute不會有相同的簽名......

感謝

回答

0

需要注意的是子類還是應該服從Liskov substitution principle

不過,解決方法是在MyDescriptorExtractor的構造函數中傳遞你需要的參數,它允許你保持相同的簽名。

+0

我想象一下'MyDescriptorExtractor'的方法叫'keepHistory'必須運行。無論如何,我覺得這些選項有點髒... – Eric 2012-03-07 15:46:45