Verständniss von Vererbung/ Dynamische Bindung
-
Buch C++ Primer Chap 15.2 S. 667/668
Es geht um die dynamische Bindung in Methoden. Es wird von einer Basisklasse item_base und einer abgeleiteten Klasse bulk_item ausgegangen. Item Base hat die Argumente private isbn und protected price, und die methoden string book() virtual double net_price(std::size_t n) const.
Nun wird davon die klasse bulk_item abgeleitet die die methode net_price neu definiert und desweiteren die argumente size_t min_qty und double discount hinzufügt.Nun wird eine funktion print_total(ostream &os, const Item_base &item, size_z n) erstellt und erklärt das es bei dieser funktion darauf ankommt ob sie mit einer referenz auf bulk_item oder item_base aufgerufen wird. Also sich der Ausgebene Preis ändert je nach dem welche Referenz übergeben wird. Wie soll das gehen? Die Referenz verweist doch nur auf den Item_base teil selbst wenn ein bulk_item übergeben wird. Wie also soll die virtuelle methode net_price() von bulk_item aufgerufen werden wenn diese dann argumente benötigt die nicht im referenzierten item_base teil vorhanden sind geschweige denn die methode selber im item_base teil des objektes existiert.
Dieser Abschnitt in dem Buch verwirrt mich immernoch obwohl ich ihn mitlerweile mehrere male gelesen habe.
Mfg Jud4s
void print_total(ostream &os, const Item_base &item, size_z n) { os << "ISBN: " << item.book() // das geht ja wird ja vererbt und ist somit in dem Basisklassenteil von bulk_item << \tnumber sold: " << n << "\ttotal price: " << item.net_price(n) << endl; //wie soll das gehen wenn ein bulk_item übergeben wird, da die Item_base referenz doch lediglich auf den Item_base teil referenzieren kann :confused: }
-
Du willst wissen, wie das technisch funktioniert?
Wenn man Klassen mit virtuellen Methoden hat, wird vom Compiler ein so genannter vtable angelegt. Vereinfacht gesagt bekommt ein Objekt wenn man es erzeugt einen versteckten Zeiger auf die richtigen Methoden. Wikipedia erklärt das ausführlicher:
http://de.wikipedia.org/wiki/Tabelle_virtueller_Methoden
-
Obwohl ich generell wußte wie es geht, hab ich mir den wikipedia-Eintrag mal durchgelesen.
Jetzt bin ich etwas überrascht, dass sie in der Abbildung oben rechts eine
vtable für eine abstrakte Klasse haben. Existiert so eine wirklich
oder nur beim Kompilieren, damit man die notwendige Reihenfolge kennt?
Wenn ja, wozu dient sie?
-
nein wie das logisch gehen soll
-
Deinem geschwaller kann man nicht zweifelsfrei entnehmen, wie der Sourcecode aussieht. Warum um alles in der Welt zeigst du den Sourcecode?
Lars