继承cv::Mat,好主意



我想扩展cv::Mat类与一些功能(如序列化,采取数据指针的所有权,颜色排序(rgb/bgr/…))。

一种可能是创建一个新类(比如CustomMat),它的成员是cv::Mat:

class CustomMat {
  int width() { return m_mat.size().width; }
  int height() { return m_mat.size().height; }
  ...
  cv::Mat getMat() { return m_mat; }
  private:
  cv::Mat m_mat;
}

但是,我必须转发所有构造函数和成员以正确使用外部类。或者我必须使用像customMat.getMat().size().width这样的东西,这也不是很好。

也可以直接继承cv::Mat:

class CustomMat : public cv::Mat {
...
}

对于像cv::Mat这样的复杂类,这对我来说似乎有点可疑。你觉得这有什么缺点吗?

我看到了继承方法的一个缺点。cv::Mat没有虚析构函数。这意味着,当使用CustomMat的多态行为时,您可能会遇到麻烦。看看下面的例子。

cv::Mat* foo = new CustomMat;
delete foo;

在上面的例子中,CustomMat的析构函数永远不会被调用

不建议您这样做。这种继承的缺点有很多:切片、需要转发所有构造函数、处理工厂很困难。c++中向现有类添加功能的推荐方法是创建一组全局函数-最好包含在命名空间中-接受Mat参数。

最新更新