Idee |
ein Objekt kann die Eigenschaften aus
mehreren Klassen beziehen
ein Objekt kann mehrere Schnittstellen besitzen
|
| |
|
Beliebtes Beispiel in der OO-Literatur:
Es gibt FleischFresser
und PflanzenFresser,
AllesFresser besitzen die Eigenschaften von beiden.
|
| |
|
Autos und Schiffe
sind Unterklassen von Fahrzeug,
AmphibienFahrzeug
ist sowohl Auto
als auch Schiff.
|
| |
|
MehrfachVERerbung ist eigentlich der falsche Begriff.
|
|
MehrfachBEerbung beschreibt die Richtung des Erbens präzise.
|
in C++ |
Mehrfachvererbung erlaubt
|
| |
Beispiel |
class Point {
private:
double x;
double y;
public:
Point(double x1, double y1) {
x = x1;
y = y1;
}
double getX() const { return x; }
double getY() const { return y; }
};
|
|
class Color {
private:
int c;
public:
Color(int c1) {
c = c1;
}
int getColor() const { return c; }
};
|
|
class ColoredPoint : public Point,
public Color
{
public:
ColoredPoint(double x, double y, int c)
: Point(x,y),
Color(c) {
}
};
|
|
void f() {
ColoredPoint * cp =
new ColoredPoint(1.0,2.0,255);
cp->getX();
cp->getY();
cp->getColor();
}
|
| |
|
mit Mehrfachvererbung kann eine Klasse
ohne großen Aufwand aus bestehenden Klassen
zusammengesetzt werden.
Die beerbende Klasse enthält alle Datenfelder und
alle Methoden aus allen beerbten Klassen.
|
| |
|
Verständlichkeit?
Programmteile über viele Stellen verstreut.
|
| |
|
schwierig zu implementieren!
|
| |
|
Namenskonflikte!
|
? |
Was geschieht, wenn mehrere Oberklassen
gleiche Methoden definieren?
|
? |
Was geschieht, wenn mehrere Oberklassen
eine gemeinsame Oberklasse als Vorfahre
in der Klassenhierachie besitzen?
|
| |
Namenskonflikte |
bei Mehrfachvererbung
|
|
class X {
public:
int d;
void foo() { ++d; }
};
|
|
class Y1 : public X {
public:
int d1;
void bar() { ++d1; }
};
|
|
class Y2 : public X {
public:
int d2;
void bar() { --d2; }
};
|
|
class Z : public Y1, public Y2 {
};
|
|
void f() {
Z * o;
o->bar();
o->foo();
o->d;
}
|
| |
? |
Wann ist Mehrfachvererbung sinnvoll?
|
| |