Estoy tratando de utilizar la clase base abstracta C++ de la misma manera que con la interfaz Java. Se supone que hemos siguientes clases de interfaz con funciones virtuales solamente puros:Herencia paralela entre clases de interfaz y clases de implementación en C++
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; };
y yo tratamos de poner en práctica cuadrado y del rectángulo de la siguiente manera:
class SquareImpl : public Square { /*implementation*/ };
class RectangleImpl : public SquareImpl, Rectangle { /*implementation*/ };
Dónde RectangleImpl
hereda tanto SquareImpl
y Rectangle
volver a utilizar, por ejemplo , SquareImpl::area()
. Sin embargo, cuando intento compilar, surgen dos problemas: en primer lugar, todos los métodos en SquareImpl
no se heredan correctamente y tengo que volver a implementar manualmente RectangleImpl::area()
y RectangleImpl::setLength()
. En segundo lugar, esto todavía presenta el problema del diamante que Shape
es una base ambigua de RectangleImpl
.
Pude compilar el código si heredo virtualmente Square
de Shape
, pero no creo que el rendimiento se escale con más interfaces derivadas agregadas. También extrañamente, RectangleImpl
aún no hereda SquareImpl::setLength()
aunque SquareImpl::area()
se hereda bien. (ignore la practicidad aquí)
Otra solución podría ser hacer que las interfaces sean independientes entre sí, es decir, hacer que Square
no se herede de Shape
. Pero hacerlo me hará perder el acceso a los métodos en Shape
si defino funciones que toman un puntero Square*
. También hará que static_cast sea imposible entre Shape
y Square
.
Así que mi pregunta es, ¿hay algún otro patrón de diseño en C++ para resolver este tipo de herencia paralela entre las clases de interfaz y las clases de implementación, sin requerir herencia virtual?
(edición aclaración: el código de ejemplo anterior son sólo mi ilustración ficticia sobre la herencia paralelo entre las interfaces e implementaciones entiendo que hay mejores formas de implementar formas pero mi problema no es sobre cómo implementar formas..)
"¿Dónde RectangleImpl hereda tanto SquareImpl y Rectángulo para la reutilización, por ejemplo, SquareImpl :: área()" => heredan para ser reutilizado, no volver a utilizar. – icecrime
víctima de http://stackoverflow.com/questions/249500/looking-for-a-better-way-than-virtual-inheritance-in-c? –
¿Está prevista la herencia no pública de Rectangle en RectangleImpl? – daramarak