I'm trying to use C++ abstract base class in the way similar with Java interface. Supposed that we have following interface classes with only pure virtual functions:
class Shape { virtual double area()=0; };
class Square : public Shape { virtual void setLength(double length)=0; };
class Rectangle : public Square { virtual void setWidth(double width)=0; };
and I try to implement Square and Rectangle the following way:
class SquareImpl : public Square { /*implementation*/ };
class RectangleImpl : public SquareImpl, Rectangle { /*implementation*/ };
Where RectangleImpl
inherits both SquareImpl
and Rectangle
to reuse, say, SquareImpl::area()
. However when I try to compile, two problems arise: Firstly, all methods in SquareImpl
do not get inherited properly and I have to manually reimplement RectangleImpl::area()
and RectangleImpl::setLength()
. Secondly, this still introduces the diamond problem that Shape
is ambiguous base of RectangleImpl
.
I could compile the code if I virtually inherit Square
from Shape
, but I don't think the performance will scale with more derived interfaces added. Also strangely, RectangleImpl
still doesn't inherit SquareImpl::setLength()
although SquareImpl::area()
is inherited well. (ignore the practicality here)
Another solution might be to make interfaces independent of each other, i.e. to make Square
not inherited from Shape
. But doing so will make me lose access to methods in Shape
if I define functions that take a Square*
pointer. It will also make static_cast impossible between Shape
and Square
.
So my question is, is there any other design pattern in C++ to solve this kind of parallel inheritance between interface classes and implementation classes, without requiring virtual inheritance?
(edit clarification: the example code above are just my dummy illustration on parallel inheritance between interfaces and implementations. I understand that there are better ways to implement shapes but my problem is not on how to implement shapes.)