Sto cercando di utilizzare la classe base astratta C++ in modo simile con l'interfaccia Java. Suppone che abbiamo seguenti classi di interfaccia con funzioni virtuali solo puri:Ereditarietà parallela tra classi di interfaccia e classi di implementazione in 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; };
e cerco di implementare rettangolo e del quadrato seguente modo:
class SquareImpl : public Square { /*implementation*/ };
class RectangleImpl : public SquareImpl, Rectangle { /*implementation*/ };
Dove RectangleImpl
eredita sia SquareImpl
e Rectangle
riutilizzare, diciamo , SquareImpl::area()
. Tuttavia, quando provo a compilare, sorgono due problemi: in primo luogo, tutti i metodi in SquareImpl
non vengono ereditati correttamente e devo reimplementare manualmente RectangleImpl::area()
e RectangleImpl::setLength()
. In secondo luogo, questo introduce ancora il problema dei diamanti che Shape
è una base ambigua di RectangleImpl
.
ho potuto compilare il codice se praticamente ereditato Square
da Shape
, ma non credo che le prestazioni saranno scala con interfacce più derivati aggiunto. Anche stranamente, RectangleImpl
non eredita ancora SquareImpl::setLength()
sebbene SquareImpl::area()
sia ereditato bene. (ignorare la praticità qui)
Un'altra soluzione potrebbe essere quella di rendere le interfacce indipendenti l'una dall'altra, vale a dire rendere Square
non ereditato da Shape
. Ma farlo mi farà perdere l'accesso ai metodi in Shape
se definisco funzioni che prendono un puntatore Square*
. Renderà anche static_cast impossibile tra Shape
e Square
.
Quindi la mia domanda è: esiste un altro modello di progettazione in C++ per risolvere questo tipo di ereditarietà parallela tra classi di interfaccia e classi di implementazione, senza richiedere l'ereditarietà virtuale?
(modifica precisazione: il codice di esempio di cui sopra sono solo la mia illustrazione manichino su eredità parallelo tra le interfacce e le implementazioni Capisco che ci sono modi migliori per attuare forme ma il mio problema non è su come implementare le forme..)
"Dove RectangleImpl eredita sia SquareImpl e Rettangolo di riutilizzare, ad esempio, SquareImpl :: area()" => ereditano per essere riutilizzati, non riutilizzare. – icecrime
dupe di http://stackoverflow.com/questions/249500/looking-for-a-better-way-than-virtual-inheritance-in-c? –
È prevista l'ereditarietà non pubblica di Rectangle in RectangleImpl? – daramarak