Beh ho provato per me stesso, perché ci sono un sacco di cose che possiamo pensare:
#include <iostream>
using namespace std;
class A
{
public:
virtual void v() { cout << "A virtual" << endl; }
void f() { cout << "A plain" << endl; }
};
class B : public A
{
public:
virtual void v() { cout << "B virtual" << endl; }
void f() { cout << "B plain" << endl; }
};
class C : public B
{
public:
virtual void v() { cout << "C virtual" << endl; }
void f() { cout << "C plain" << endl; }
};
int main()
{
A * a = new C;
a->f();
a->v();
((B*)a)->f();
((B*)a)->v();
}
uscita:
A plain
C virtual
B plain
C virtual
Penso che una risposta buona, semplice e breve potrebbe assomiglia a questo (perché penso che le persone che possono capire di più possano memorizzare meno e quindi necessitano di una spiegazione breve e semplice):
Metodi virtuali per il DATI dell'istanza il puntatore punta a, mentre i metodi classici non chiamano quindi il metodo che corrisponde al tipo specificato.
Il punto di tale funzione è il seguente: si supponga di disporre di un array di A. La matrice può contenere B, C, (o anche tipi derivati). se si desidera chiamare in modo sequenziale lo stesso metodo di tutte quelle istanze, si chiamerà ciascuna di esse sovraccaricata.
Trovo che questo sia abbastanza complicato da comprendere, e ovviamente qualsiasi corso di C++ dovrebbe spiegare come questo è stato realizzato, perché la maggior parte delle volte ti vengono insegnate solo le funzioni virtuali, le usi, ma finché non capisci come il compilatore le capisce e come l'eseguibile gestirà le chiamate, tu sei al buio.
La cosa su VFtables è che non mi è mai stato spiegato quale tipo di codice aggiunge, e questo è ovviamente qui dove C++ richiede molta più esperienza di C, e questo potrebbe essere il motivo principale per cui il C++ è stato etichettato come "lento" in i suoi primi giorni: in effetti, è potente, ma proprio come tutto, è potente se sai come usarlo, oppure semplicemente "fai saltare tutta la gamba".
Un esempio esplicito sarebbe stato molto apprezzato, credo. – jokoon