我有一个使用 opencv 函数的程序,例如calibratecamera
. 现在我正在研究我的代码的最终版本,我想知道是否不调用 opencv 的函数而是在我的类中继承它们会使我的程序“更好”?
2 回答
正如评论中指出的那样,您的问题非常“笼统”并且不知何故感到困惑。但是,对于“继承更好吗?”这个问题有一个一般性的答案。当然,作为一般性答案,它过于简单化,可能不适用于您的情况。
“C++ 编码标准”(Sutter,Alexandrescu)中的第 58 项,标题为
更喜欢组合而不是继承
你也可以在其他几本书中找到类似的建议。
他们提出理由的原因是:
避免继承税:继承是 C++ 中第二紧密的耦合关系,仅次于友谊。紧耦合是不可取的,应尽可能避免。因此,除非您知道后者真正有利于您的设计,否则更喜欢组合而不是继承。
所以,一般的建议是尽量避免继承,并且在使用它时始终保持保守,除非你有很强的理由。例如,如果您正在建模所谓的“is-a”关系,那么您就有使用公共继承的案例。另一方面,如果您处于以下情况之一,则可以使用非公共继承:
- 如果你需要重写一个虚函数
- 如果您需要访问受保护的成员
或在其他不太常见的情况下。
无论您的最终选择是什么,请确保仅从设计为基类的类继承。例如,确保基类析构函数是虚拟的。正如引用的书所提出的那样:
使用独立类作为基础是一个严重的设计错误,应该避免。要添加行为,最好添加非成员函数而不是成员函数(参见条款 44)。要添加状态,更喜欢组合而不是继承(参见条款 34)。避免从具体的基类继承
OpenCV 是一个具有良好定义的 API 的库。如果您有一个使用捆绑在此库中的函数的现有应用程序,并且您没有正当理由向它们添加附加功能,则包装它们没有任何好处。
如果你想改变接口,因为你认为它会让你的代码更干净,我会担心维护,以防 API 将来发生变化。
在更改应用程序的设计时,您的决定应该基于特定的原因。“我想让我的程序更好”太抽象了。