虚拟运算符重载

时间:2012-09-03 02:25:00

标签: c++ operator-overloading

我正在制作一个GVector类,其中包含将进一步派生为3种类型,即 PVector(像素空间矢量)
MVector(Meter Space Vector)
RVector(渲染空间矢量)

class GVector {
  public : 
    eVectorSpace eVS; // Defines which space the vector would be
    float x,y; // The x and y values of a 2-Dimensional vector
    ...
    GVector operator+ (const GVector& v) const { return GVector(x+v.x, y+v.y, v.eVS); }
    ...
};

class MVector {
  public :
    PVector toPVector() {...}
    //Will contain functions to convert the same vector into a different space
};

我希望能够在同一个空间中添加2个向量

MVector operator+ (const MVector& v) const { return MVector(x+v.x, y+v.y); }  

我是否需要像这样制作基类功能?

virtual GVector* operator+ (const GVector* v) const () = 0;  

但我想在两个添加向量的同一空间中返回一个向量。

对于每种类型的向量,添加x,y的值的功能是相同的。 有没有办法将其最小化到基类本身? 或者是否有更好的方法在同一空间中添加矢量并将它们转换为不同的空间?

2 个答案:

答案 0 :(得分:2)

如果对两个不同的孩子进行操作没有意义,那么操作员应该在父母上定义。相反,可以定义受保护的辅助函数,然后子元素应该单独实现运算符,委托给辅助函数。

答案 1 :(得分:1)

某些代码需要知道如何将两个矢量对象一起添加,但它实际上并不需要是矢量类型本身。您可以在类外定义一组加法运算符。

MVector operator+(const MVector &left, const MVector &right) {
    return MVector(left.x + right.x, left.y + right.y);
}

您可以根据需要定义任意数量的不同运算符添加,只要编译器能够在没有歧义的情况下找出类型是什么。您甚至可以提供接受MVectorGVector的实现。

MVector operator+(const MVector &left, const RVector &right) {
    MVector tmp = right.toMVector();
    return MVector(left.x + tmp.x, left.y + tmp.y);
}