关于C++上虚拟运算符*的问题

Jae*_*bum 2 c++ virtual inheritance operator-overloading

我试图在C++上创建虚拟运算符

class Data
{
    virtual Matrix operator* (Matrix &_matrix);
    virtual Scalar operator* (Scalar &_scalar);
};

class Matrix : public Data
{
private:
    vector<vector<double>> data;
public:
    // ...
    Matrix operator* (Matrix &_matrix);
};

class Scalar : public Data
{
private:
    double data;
public:
    // ...
    Scalar operator* (Scalar &_scalar);
};
Run Code Online (Sandbox Code Playgroud)

问题是,当我创建Data*Array时,如下所示

Data* arr[10];
arr[0] = new Matrix(3,3);
arr[1] = new Matrix(3,3);

arr[0]->operator*(arr[1]);
Run Code Online (Sandbox Code Playgroud)

我无法在这两个矩阵之间进行乘法运算,因为我不能将Data作为参数传递.但问题是,我不能使函数的参数采用Data*类型,因为它将无法访问Matrix或Scalar对象的私有成员.

如何应对这种奇怪的情况?

Kei*_*ith 6

班级双重调度问题 - 见梅耶(忘了哪一个).您需要操作员在lhs和rhs上都是虚拟的,因此您需要两个虚拟调用:

class Matrix;
class Scalar;

class Data
{
public:
    virtual Data* operator* (Data& data) = 0;
    virtual Data* operator* (Matrix &matrix) = 0;
    virtual Data* operator* (Scalar &scalar) = 0;
};

class Matrix : public Data
{
private:
    std::vector<std::vector<double>> data;

    // ...
public:
    Matrix* operator* (Matrix &_matrix)
    {
        // implement
    }
    Matrix* operator* (Scalar& scalar)
    {
        // implement
    }
    Data* operator* (Data &data)
    {
        // Magic here - *this is now Matrix, not Data
        return data * (*this);
    }
};

class Scalar : public Data
{
private:
    double data;
public:
    // ...
    Data* operator* (Data& data)
    {
        // Magic here - *this is now Scalar, not Data
        return data * (*this);
    }
    Scalar* operator* (Scalar &scalar)
    {
        // implement
    }

    Matrix* operator* (Matrix &matrix)
    {
        // Note how we need to allow for parameter reveral during the double dispatch
        Matrix& lhs = matrix;
        Matrix& rhs = *this;
        // Compute matrix product lhs * rhs
    }

};
Run Code Online (Sandbox Code Playgroud)

我已经掩盖了返回类型和内存管理的问题.与运算符一样,您可能更好地定义*=为原语.然后可以返回引用*this.然后*可以根据运营商进行定义*=.再一次,这是"有效的C++".