虚拟功能
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;
};
对于不同类型的描述符,如Surf 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
的构造函数中传递所需的参数,这样可以保持相同的签名。
相关文章:
- 如何在C++中获得"静态纯虚拟"功能?
- std::is_trivially_copyable_v 关于虚拟功能
- 类似虚拟的朋友功能?
- 是否有任何模式等效于虚拟模板功能?
- 隐藏重载虚拟功能的模板化访客:SFINAE 在使用?
- 为什么我无法覆盖虚拟功能?
- 二叉搜索树 - 使用 Linux 在虚拟机中制作删除功能
- 虚拟功能不起作用
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 虚拟功能如何影响static_cast?
- __declspec(属性)和虚拟功能
- 实现来自第三方类的虚拟功能
- 消除未使用的虚拟功能
- 为什么虚拟继承即使不涉及虚拟功能也需要 vtable?
- C 虚拟功能的输出
- 抽象类 A 由类 C 继承"through"类 B "intermediary"。如何声明虚拟功能?
- 虚拟功能是否不太可能导致堆栈溢出
- 使用继承和虚拟功能应用五个规则
- 父会员功能中虚拟函数的C 行为
- 在多态性中重新定义功能(虚拟),具有不同数量的参数