Hallo Gurus,
Hi Christof,
bin zwar kein Guru, aber vielleicht kann ich dir ja dennoch helfen. Mal schauen.
virtual GraphObject *Clone() const = 0;
Da wird eine virtuelle Methode namens „Clone“ definiert, die einen pointer auf ein Objekt vom Typ „GraphicObject“ zurückliefert und die das Ursprungsobjekt (in dem sie aufgerufen wird) nicht verändert. Da diese Methode rein virtuell ist, wird sie mit 0 belegt. Und ja, es geschieht hier in der Tat nichts! 
virtual GraphObject *Clone();
…
GraphObject *Rectangle::Clone() const
{
return new Rectangle(*this);
}
Rechtangle ist eine von GraphObject abgeleitete Klasse, oder anders ausgedrückt, ein Rectangle ist ein GraphObject, allerdings in diesem Falle ein konkretes. Hier wird dann die in GraphObject noch virtuelle Methode „Clone“ (du hast oben vermutlich das const vergessen?) konkretisiert, d.h. implementiert. Das „virtual“ hier heißt nichts anderes, als daß eine von Rectangle abgeleitete Klasse diese Methode ihrerseits neu implementieren kann, aber das kann man glaube ich auch weglassen, da eine Methode immer virtuell ist, wenn sie’s einmal war (kann aber auch sein, daß ich mich hier irre).
Jedenfalls macht die Methode folgendes: Nehme den Pointer auf das aktuelle Objekt (this), dereferenziere ihn (*this), d.h. *this ist dann das aktuelle Objekt. Dann wird der sog. „Copy Constructor“ der Klasse Rectangle aufgerufen. Der macht nichts anderes als eine Kopie aller Attribute des alten Objekts anzufertigen und daraus ein neues Objekt der gleichen Klasse zu bauen. Das ganze wurde mit „new“ aufgerufen, also gibt’s einen Pointer auf das neue Objekt zurück.
Ich hoffe, das schafft etwas Klarheit?
Chris