直观C++运算符重载和继承
visual C++ Operator Overload and Inheritance
所以我创建了一个通用矩阵类,它具有以下运算符重载:
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).
你正在咬最烦人的解析。这是一个语法错误,导致声明函数而不是对象。
问题不在于重载运算符,而在于您定义的变量,您可能认为 m1
和 m2
属于 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 对象确实可以相乘。我不确定为什么你会遇到任何问题。
- 继承函数的重载解析
- 重载继承的构造函数
- C++中的函数重载和继承
- C++ 继承:基类中重载 operator+ 的 2 次在派生类中无法正常工作
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- 类继承和运算符重载
- 通过继承重载运算符会导致歧义
- 使用继承的指针列表复制构造函数或重载运算符=
- 重载<<无法访问继承的私有数据
- C++:涉及继承和"using"时的方法重载
- C++具有多重继承的构造函数重载解析
- c++ 中的函数重载如何在没有钻石继承的情况下工作?
- 函数不参与继承中的重载解析
- 继承类 C++ 中的重载>>
- 模板和unique_ptr继承情况下的重载解决方案
- 如何将同名的继承函数视为重载函数
- 继承重载函数:需要命名空间
- 派生类没有从基类继承重载方法
- c++继承+重载
- c++继承重载成员