In Artikel 27 der "Effective C++" (3. Auflage, Seite 118), sagte Scott Meyers:Mehr als 1 Adresse für abgeleitete Klassenobjekte?
class Base { ... };
class Derived: public Base { ... };
Derived d;
Base *pb = &d;
Hier sind wir nur eine Basisklasse Zeiger auf eine abgeleitete Klasse-Objekt erstellen, aber manchmal, die zwei Zeiger werden nicht gleich sein. Wenn dies der Fall ist, wird zur Laufzeit ein Offset auf den Zeiger
Derived*
angewendet, um den korrekten ZeigerwertBase*
zu erhalten.Dieses letzte Beispiel zeigt, dass ein einzelnes Objekt (zB ein Objekt vom Typ
Derived
) könnte mehr als eine Adresse (zB die Adresse, wenn sie durch einenBase*
Zeiger und die Adresse zeigte auf, wenn sie von einemDerived*
Zeiger gezeigt wird) .
Hier ist ein bisschen schwer zu verstehen. Ich weiß, dass ein Zeiger auf die Basisklasse auf ein Objekt der abgeleiteten Klasse zur Laufzeit zeigen kann, dies nennt man Polymorphismus oder dynamische Bindung. Hat das abgeleitete Klassenobjekt wirklich mehr als 1 Adresse im Speicher?
Rate ich habe ein Missverständnis hier. Könnte jemand etwas Klärung geben? Vielleicht hat das etwas damit zu tun, wie Polymorphie im C++ - Compiler implementiert wird?
"mit einfacher Vererbung ist es normalerweise" - können Sie an Fälle denken, wo es * nicht * wäre? – us2012
@ us2012: Nicht-polymorphe Basisklasse, polymorphe abgeleitete Klasse, vtable-Zeiger, der bei Offset 0 in der abgeleiteten Klasse hinzugefügt wird, gefolgt von der Basisklasse. – MSalters
@MSalters Nizza! Vielen Dank. – us2012