如何在基类和派生类上操作时返回派生类型?

时间:2016-10-27 22:36:43

标签: c++

我有两个课程,my_matrixmy_vector课程,其中my_vector来自my_matrix

当我执行my_matrix tmp = vec * mat时,它会返回一个矩阵(matmy_matrix的实例,vecmy_vector的实例。我在这儿很好。

但是当我my_vector tmp = mat * vec时,我在clang ++中得到了这个错误:

  

my_matrix' my_vector'到' my_matrix'

和g ++中的错误:

  

转换自&{39; my_vector'到非标量类型' mat'请求的

我想我知道问题所在。在vecmy_matrix相乘后,返回类型为void operator*(my_vector&, my_matrix&)您无法将基类转换为派生类

您认为解决方案是什么?

我已经尝试定义my_vector operator*(my_matrix&)(不是派生类的成员函数),它在派生类中调用class my_matrix{ public: my_matrix operator*(my_matrix& other_mat){ my_matrix tmp(row, other_mat.col); // for loop to matrix multiply that fill up the tmp return tmp; } }; class my_vector:public my_matrix{ public: // not sure if I need operator* here // Somehow I want to bring the my_vector tmp = mat * vec; here so // it would return vector instead of matrix // I have tried : but not successful // my_vector operator*(my_matrix&) // void operator*(my_vector&, my_matrix&); (non member) }; int main(){ my_matrix mat = {{1,2,3},{4,5,6}}; // 2x3 my_vector vec = {1,2,3}; // 3x1 my_vector tmp = mat * vec; // 2x3 * 3*1 gives 2x1 vector } ,但它到目前为止还不起作用。

bls_map_county2()

2 个答案:

答案 0 :(得分:1)

首先,现有operator*的参数错误:

my_matrix operator*(my_matrix& other_mat){

*运算符的参数应为const,方法本身应为const。毕竟,乘法运算符不应该修改任何一个操作数:

my_matrix operator*(const my_matrix& other_mat) const {

解决了这个问题,你现在可以有意义地重载运算符:

my_vector operator*(const my_vector& other_mat) const {

以您想要定义此操作的任何方式实现乘法运算。

现在,my_matrix中的my_matrix乘以my_vector,并乘以my_vector返回my_matrix*运算符导致{{1}}重载,返回值取决于您将其乘以的内容。

答案 1 :(得分:1)

尝试这样的事情:

class my_matrix {
public:
    my_matrix operator*(const my_matrix& other_mat) const {
        my_matrix tmp(row, other_mat.col);
        // for loop to matrix multiply that fill up the tmp
        return tmp;
    }
};

class my_vector : public my_matrix {
public:
    using my_matrix::operator*;

    my_vector operator*(const my_vector& other_vec) const {
        my_vector tmp(...);
        // for loop to vector multiply that fill up the tmp
        return tmp;
    }
};

my_vector operator*(const my_matrix &lhs, const my_vector &rhs)
{
    my_vector tmp(...);
    // for loop to vector multiply that fill up the tmp
    return tmp;
}

int main() {
    my_matrix mat = {{1,2,3},{4,5,6}}; // 2x3
    my_vector vec = {1,2,3}; // 3x1

    my_vector tmp = mat * vec; // 2x3 * 3x1 gives 2x1 vector
}