我想扩展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
参数。