004
08.06.2004, 08:41 Uhr
stephanw
localhorst
|
Der Grund ist (wie der Schlumpf schon richtig beschrieben hat) der sog. Polymorphismus. Damit bezeichnet man das Verhalten eines Objekts, vielgestaltig zu sein. Dies macht nur mit Vererbung Sinn. Wenn man "public" erbt, erbt man die oeffentliche Schnittstelle der Basisklasse mit. Insbesondere ist jedes Objekt der Unterklasse ueberall dort einsetzbar, wo auch ein Objekt der Oberklasse (==Superklasse) einsetzbar ist. Dennoch haben die beiden Objekte verschiedenes Verhalten, da die virtuellen Funktionen in der Unterklasse ja ueberschrieben worden (sein koennen). Dies ist aber fuer den Aufrufer transparent. Bsp:
C++: |
class A { public: virtual void move (int feet) { // code } };
class B : public A { public: virtual void move (int feet) { // andere Code } };
void f (A* p) { p->move (10); }
int main () { A* a = new A (); B* b = new B (); f (a); f (b); return 0; }
|
Der Aufruf f(b) geht, weil jedes B auch ein A ist. Weil move () virtual ist, wird automatisch die richtige Funktion aufgerufen, obwohl es fuer f voellig transparent ist, ob p nun vom Typ A oder B ist. Um diese Art Polymorphismus zu erreichen, MUSS der Funktionsaufruf ueber .Zeiger oder Referenz gemacht werden. Virtuelle Funktionen muessen in der Ableitung 100 % die gleiche Signatur haben, damit sie "ueberschrieben" werden.
Das funktioniert wohl i.d.R. durch eine virtuelle-Funktionen-Ttabelle. Dort steht (fuer jede Klasse) die Adresse der richtigen Funktion drin. Jedes Objekt hat dann einen Zeiger auf die Tabelle seiner Klasse, der eben 4 Byte mehr beansprucht. Dies ist fuer den Programmierer transparent, laesst sich aber mit sizof testen .Der Funktionsaufruf ist wegen der Tabelle indirekt.
Sonst gibt es "rein virtuelle" Funktionen noch mit dem Suffix "= 0"
C++: |
class Foo { public: virtual void doSomething () = 0; };
|
die in der Ableitung ueberschrieben werden MUESSEN. Foo ist damit abstrakt (es koennen keine Objekte angelegt werden).
Bis neulich! -- Reden ist Schweigen und Silber ist Gold. Dieser Post wurde am 08.06.2004 um 08:43 Uhr von stephanw editiert. |