[英]Virtual function
在計算機視覺庫中,基類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;
};
對於不同類型的描述符,例如Sift of Sift,我們從基類派生:
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
將不會具有相同的簽名...
謝謝
請注意,子類化仍應遵循Liskov替換原則 。
解決方案仍然是在MyDescriptorExtractor
的構造函數中傳遞所需的參數,該參數允許您保留相同的簽名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.