簡體   English   中英

虛擬功能

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

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