我有一个包含一些数据结构的基类,以及一些包含完全相同的数据的派生类,但赋予了一些额外的功能,比如说(为了具体):
struct Derived : public std::vector<double>
{
// Constructors, define or inherit
using std::vector<double>::vector;
double norm() const;
}
现在在代码的另一部分中,我想在基类型norm()
的对象obj
上调用函数std::vector<double>
。通常这没有意义,但在这里:
Derived
可以从它的基础构造(构造函数是在示例中使用using声明导入的),Derived
和itss base具有完全相同的数据成员。我可以打电话:
Derived(obj).norm()
但我想避免不必要的副本。
有没有办法简单安全地重新解释具有相同底层数据结构的对象?或者也许是着装数据结构的设计模式,有(相当大的)函数集可以完全避免这个问题?
答案 0 :(得分:3)
惯用的方法是提供免费功能而不是成员函数:
double norm(const std::vector<double>& v)
{
// ...
}
这完全避免了这个问题。
答案 1 :(得分:0)
您可以重载该功能以及全部:
struct Derived : public std::vector<double> {
using std::vector<double>::vector;
inline double norm() const { return norm(*this); }
static double norm(const std::vector<double> &) const;
}
现在,您可以调用Derived::norm(obj)
和derived.norm()
,其中:
obj
是std::vector<double>
Derived
是班级derived
是类型为Derived
如果您希望对待 Derived
,就好像它是它的基础,请使用它的基础。