Ecco la definizione della classe:In C++, questo metodo chiama associazione statica o associazione dinamica?
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() { ... }
... };
E qui è il codice del client:
Square* sq = new Square;
Rectangle* rect = new Rectangle;
Shape* ptr_shape;
ptr_shape = sq;
ptr_shape->draw();
rect->draw();
Un libro che stavo leggendo detto l'ultima affermazione è statica vincolante:
Tuttavia, la frase sembra ancora vincolante dinamicamente perché rect->draw
deve essere chiamata da Puntatore nella "vtable" di rect
in fase di esecuzione.
Qualcuno ha idee sul fatto che lo rect->draw
sia un collegamento statico o un collegamento dinamico?
'final' gli impediva di compilare. Vieta l'override piuttosto che fermarlo. –
@DmitryRubanovich: Poiché il metodo 'final' non può essere sovrascritto (quindi non assumendo' Square :: draw'), come ottimizzazione, il compilatore può chiamare il metodo 'final' senza usare * vtable *. – Jarod42
il compilatore non chiama nulla. Genera il codice che (metaforicamente) effettua le chiamate. Un compilatore non può generare il codice in una sottoclasse che sovrascrive un metodo 'final' in una super classe. Un compilatore deve generare un errore in fase di compilazione se incontra tale codice. Generare codice che ignorerebbe la virtualità di una funzione significherebbe infrangere la dichiarazione. In altre parole, non sarebbe un'ottimizzazione del compilatore. Sarebbe un bug del compilatore. –