【发布时间】:2011-11-20 17:26:20
【问题描述】:
我试图在 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);
};
问题是,当我创建如下所示的 Data* 数组时
Data* arr[10];
arr[0] = new Matrix(3,3);
arr[1] = new Matrix(3,3);
arr[0]->operator*(arr[1]);
我无法在这两个矩阵之间进行乘法运算,因为我无法将 Data 作为参数传递。 但问题是,我不能让函数的参数采用 Data* 类型,因为它无法访问 Matrix 或 Scalar 对象的私有成员。
如何处理这种奇怪的情况?
【问题讨论】:
-
你只会在运行时知道你是在处理矩阵还是标量?或者你会在编译时知道你的数学表达式吗?
-
这会很棘手。但请注意,这些运算符的返回类型应为
Data*,因为编译器在编译时无法知道结果是Matrix还是Scalar。 -
[ 在仔细思考了这一点之后,我对这种方法有一些评论。 ] 对于我来说,一个好的 API 的基础是显式和隐式语义应该匹配行为。如果使用运算符,则意味着语义必须与内置类型相同。这意味着
operator*是按值返回的。对于协变返回类型,这是不可能的。它遵循你不能有一个具有干净语义的双重调度operator*。我建议要么使用明确的方法名称,要么只定义operator*=。
标签: c++ inheritance operator-overloading virtual