直观C++运算符重载和继承

visual C++ Operator Overload and Inheritance

本文关键字:继承 重载 运算符 C++ 直观      更新时间:2023-10-16

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

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

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

class Matrix2 : public Matrix
{
};

当我尝试将两个 Matrix2 对象相乘时,我收到一个编译器错误,指出:

'找不到采用 Matrix2 类型为左操作数的运算符(或者没有可访问的转换)"

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

编辑:

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

我可以将两个矩阵对象

相乘就可以了,但我不能将两个矩阵 2 对象相乘。

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).

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

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

这是@DeadMG在他的回答中提到的最令人烦恼的解析。

看看这篇关于运算符重载的文章,它很好地解释了事情。

正如@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 对象确实可以相乘。我不确定为什么你会遇到任何问题。