Problem statement: Let Matrix
be a base class which is subclassed by DenseMatrix
and SparseMatrix
(and possibly others). What I would like to achieve is the following:
Matrix *A = new DenseMatrix();
Matrix *B = new SparseMatrix();
Matrix C = (*A) + (*B); // dense + sparse
Matrix D = (*A) + (*A); // dense + dense
Matrix E = (*B) + (*B); // sparse + sparse
Even better, I would like to have the following:
DenseMatrix C = (*A) + (*B);
DenseMatrix D = (*A) + (*A);
SparseMatrix E = (*B) + (*B);
Now, when adding a DenseMatrix
with a SparseMatrix
having declared both as Matrix
implies that there must be an operator+
definition in Matrix
.
I have already read this answer which makes use of an interface AddEnabled<Foo>
, but doesn't seem to be a good solution when (almost) any possible combination of summands. I could possibly define in DenseMatrix
the following functions:
friend DenseMatrix operator+ (DenseMatrix const& left, DenseMatrix const& right);
But then again it will be impossible to add two instances of DenseMatrix
declared as Matrix
(i.e., Matrix *A = new DenseMatrix();
).
From various similar questions and answers I suspect that the pimpl idiom could be relevant, but I don't see how.
Note: I'm coding in C++98, not C++11.
Update: As Dieter Lücking suggested in his answer an opeator+
needs to be introduced in the base class. This makes sense, but the problem is that Matrix
, being abstract, does not allow methods which return abstract types. However, it is possible to return a pointer or a reference to Matrix
; this way we would have a definition like:
Matrix& operator+(const Matrix& right) const;
To an extent this would work, but users of my code would expect a +
to return a Matrix
instead of a reference to one.