我有一个VectorN类,一个Vector3继承自的类VectorN(例如可以处理交叉产品).我无法确定不同运营商的退货类型.例:
class VectorN
{
public:
VectorN(){};
virtual VectorN operator*(const double& d) {.....};
std::vector<double> coords;
};
class Vector3 : public VectorN
{
public:
Vector3(){};
virtual Vector3 operator*(const double& d) {....};
};
Run Code Online (Sandbox Code Playgroud)
此特定示例产生C2555错误:
'vector3 :: operator*':覆盖虚函数返回类型不同,并且不是'VectorN :: operator*'的协变,请参见'VectorN :: operator*'的声明.
问题是我没有返回对a的引用Vector3,并且Vector3该类未在声明中完全定义operator*.但是,我希望我operator*是虚拟的,并且Vector3当我将a乘以Vector3常量时我想返回一个(否则,如果我这样做(Vector3*double).crossProduct(Vector3),它将返回错误).
我能做什么 ?
谢谢!
你需要重新设计.首先,更喜欢免费功能而不是成员功能.您应该拥有的唯一成员函数是需要访问私有函数的成员函数.
从这个组合开始:
class VectorN
{
public:
virtual VectorN& operator*=(double d)
{
/* ... */
return *this;
};
};
class Vector3 : public VectorN
{
public:
virtual Vector3& operator*=(double d)
{
return static_cast<Vector3&>(VectorN::operator*=(d));
};
};
Run Code Online (Sandbox Code Playgroud)
协方差在这里工作得很好,因为类型是引用或指针,并且您可以重用代码.(static_cast由于您知道派生类型,因此是免费的,性能方面的,安全的.)
然后你实现你的自由功能:
// optimization: if you're going to make a copy, do it in the parameter list;
// compilers can elide a copy when working with temporaries
VectorN operator*(VectorN v, double d)
{
// reuse code
return v *= d;
}
VectorN operator*(double d, VectorN v)
{
// reuse code
return v *= d;
}
Run Code Online (Sandbox Code Playgroud)
做同样的事Vector3.
所做的是你有一个简单的方法来编写这些运算符,因为你可以使用运算符的核心,并且由于协方差,返回类型匹配.
不过要注意警告,你可能不需要任何警告.您想要制作的扩展可以通过在vector或上运行的自由功能来实现valarray.
| 归档时间: |
|
| 查看次数: |
6630 次 |
| 最近记录: |