Hier ist die Klassendefinition:In C++ heißt diese Methode statische Bindung oder dynamische Bindung?
class Shape { public:
virtual void draw() = 0; ...
};
class Circle : public Shape {
public:
void draw() { ... }
... };
class Rectangle : public Shape { public:
void draw() { ... } ...
};
class Square : public Rectangle {
public:
void draw() { ... }
... };
Und hier ist der Client-Code:
Square* sq = new Square;
Rectangle* rect = new Rectangle;
Shape* ptr_shape;
ptr_shape = sq;
ptr_shape->draw();
rect->draw();
Ein Buch, das ich lesen die letzte Anweisung sagte, war statisch ist verbindlich:
Allerdings sieht die Aussage immer noch dynamisch für mich aus, da rect->draw
von th aufgerufen werden sollte Der Zeiger in der "vtable" von rect
in der Laufzeit.
Hat jemand Ideen darüber, ob die rect->draw
statische Bindung oder dynamische Bindung ist?
'final' würde verhindern, dass es kompiliert wird. Es verbietet das Überschreiben, statt es zu stoppen. –
@DmitryRubanovich: Da 'final' Methode nicht überschrieben werden kann (also keine' Square :: draw' vorausgesetzt wird), kann der Compiler als 'optimization' die 'final' Methode ohne die * vtable * aufrufen. – Jarod42
der Compiler ruft nichts auf. Es erzeugt den Code, der (metaphorisch) die Anrufe macht. Ein Compiler kann den Code in einer Unterklasse nicht generieren, der eine "final" -Methode in einer Superklasse außer Kraft setzt. Ein Compiler muss einen Kompilierungsfehler generieren, wenn er auf einen solchen Code stößt. Einen Code zu generieren, der die Virtualität einer Funktion ignoriert, würde bedeuten, die Deklaration zu brechen. Mit anderen Worten, es wäre keine Compiler-Optimierung. Es wäre ein Compilerfehler. –