Multiple Inheritance
Multiple Inheritance
1 2
Example Solutions
Object
• Make Complex a subclass of Number and
override Ordered methods
Ordered
• Avoid inheritance, and redefine all methods
• Use a partial inheritance hierarchy
Char Number
• Use multiple inheritance
3 4
GraphicalCardDeck
5 6
Cosc346 – Multiple Inheritance – Lecture 11 Cosc346 – Multiple Inheritance – Lecture 11
Solution A Solution B
• Explicit disambiguation: • With different type signatures, can use straight
GraphicalCardDeck gcd; overloading:
gcd.CardDeck::draw(); class GCD : public CardDeck, public GO {
gcd.GraphicalObject::draw(); public:
virtual Card *draw(){
return CardDeck::draw();};
• A bit ugly
virtual void draw(GraphicsContext &g){
GraphicalObject::draw(g);};
};
7 8
Solution B2 Solution C
• With the same type signatures, we're in trouble:
class GCD : public CardDeck, public GO {
class GCD: public CardDeck, public GO {
public:
public:
using CardDeck::draw;
virtual void draw(){
using GraphicalObject::draw;
return CardDeck::draw();}
};
virtual void paint(){GO::draw();};
};
9 10
Solution D
class CardDeckParent : public CardDeck { Solution D
virtual void draw(){cardDeckdraw();};
virtual void cardDeckDraw(){
GraphicalCardDeck *gcd = new GCD();
CardDeck::draw();};
CardDeck *cd = dynamic_cast<CardDeck*>(gcd);
};
class GraphicalObjectParent: public GO { GraphicalObject *go =
dynamic_cast<GraphicalObject*>(gcd);
virtual void draw(){goDraw();};
virtual void goDraw(){GO::draw();}; cd->draw(); // ok
}; go->draw(); // ok
class GraphicalCardDeck:public CDP,public GOP { gcd->cardDeckDraw(); // ok
virtual void cardDeckDraw(){ gcd->goDraw(); // ok
CDP::cardDeckDraw();}; gcd->draw(); // error - ambiguous
virtual void goDraw(){GOP::goDraw();};
};
11 12
Cosc346 – Multiple Inheritance – Lecture 11 Cosc346 – Multiple Inheritance – Lecture 11
InStream OutStream
B C B C
InOutStream
D D
13 14
15 16
17 18
Cosc346 – Multiple Inheritance – Lecture 11 Cosc346 – Multiple Inheritance – Lecture 11
Example Consequences
class SortableVector: public vector {
private:
Sorter _sorter; • Families of related algorithms.
public: void sort() {
_sorter.sort(this);
• Alternative to subclassing.
}}
class Sorter {
• Eliminates conditional statements.
public: • Clients must be aware of different strategies.
virtual void sort(SortableVector tosort)=0;
} • Increases the number of objects.
class QuickSorter : public Sorter {
public: void sort(SortableVector tosort) {
...
}}
19 20