C ++运算符重载和继承

时间:2012-08-08 20:34:23

标签: c++ visual-c++ inheritance operator-overloading

所以我创建了一个通用的Matrix类,它具有以下运算符重载:

class Matrix
{
public:
    Matrix() {}
    Matrix(int i, int j, int k) {}
    Matrix operator*(const Matrix &right)
    {
    }
};

我还有一个继承自我的Matrix类的Matrix2类。

class Matrix2 : public Matrix
{
};

当我尝试将两个Matrix2对象相乘时,我得到一个编译器错误说明:

'没有找到哪个运算符采用了Matrix2类型的左手操作数(或者没有可访问的转换)'

为什么这样做以及如何通过继承正确实现运算符重载?

修改

正如我所指出的,我的问题部分是因为“最令人烦恼的解析”。现在我的问题,我认为,严格地与运算符重载和继承有关。

我可以很好地将两个Matrix对象相乘,但我不能将两个Matrix2对象相乘。

Matrix2 i;
Matrix2 m;
Matrix result = m * i;

错误消息:

  

error C2678: binary '*' : no operator found which takes a left-hand operand of type 'Matrix2' (or there is no acceptable conversion).

3 个答案:

答案 0 :(得分:3)

你正在咬最疯狂的解析。这是一个语法错误导致函数声明而不是对象。

答案 1 :(得分:2)

问题不在于重载运算符,而在于您定义的变量,您可能认为m1m2属于Matrix类型,但实际上它们是什么函数返回Matrix(没有参数)。尝试删除声明中的括号,看看事情是否更好。

这是@DeadMG在答案中提到的Most Vexing Parse

答案 2 :(得分:2)

查看有关运算符重载的this article,它解释得非常好。

正如@silvesthu所解释的那样,将乘法运算符作为一个静态函数实现2个参数并返回一个新的Matrix对象可能会更好。如果您需要以某种方式修改类,例如使用*=运算符,则可以根据静态函数实现此类。

<强>更新

编译以下代码对我有用;

class Matrix
{
public:
    Matrix() {}
    Matrix(int i, int j, int k) {}
    Matrix operator*(const Matrix &right)
    {
        return Matrix();
    }
};

class Matrix2 : public Matrix
{
};


int _tmain(int argc, _TCHAR* argv[])
{
    Matrix2 a, b;
    Matrix c = a * b;
    return 0;
}

显示两个Matrix2对象确实可以相乘。我不确定你为什么会遇到任何问题。