Il modo più semplice per spiegarlo è probabilmente questo:
virtuale fa qualche ricerca per voi, con l'aggiunta di una tabella di ricerca virtuale.
In altre parole, se non avete avuto la parola chiave virtuale e overrode un metodo, si sarebbe ancora dovuto chiamare manualmente che il metodo [mi perdoni se la mia memoria per la sintassi C++ è un po 'arrugginito in punti] :
class A { void doSomething() { cout << "1"; } }
class B: public A { void doSomething() { cout << "2"; } }
class C: public A { void doSomething() { cout << "3"; } }
void someOtherFunc(A* thing) {
if (typeid(thing) == typeid(B)) {
static_cast<B*>(thing)->doSomething();
} else if (typeid(thing) == typeid(C)) {
static_cast<C*>(thing)->doSomething();
} else {
// not a derived class -- just call A's method
thing->doSomething();
}
}
Si potrebbe ottimizzare questo un po '(per migliorare la leggibilità e la performance, più probabile), utilizzando una tabella di ricerca:
typedef doSomethingWithAnA(A::*doSomethingPtr)();
map<type_info, doSomethingWithAnA> A_doSomethingVTable;
void someOtherFuncA* thing) {
doSomethingWithAnA methodToCall = A_doSomethingVTable[typeid(thing)];
thing->(*methodToCall)();
}
Ora, che è più di un approccio di alto livello. Il compilatore C++ può ovviamente ottimizzarlo un po 'di più, sapendo esattamente che cosa è "type_info" e così via. Quindi probabilmente, invece di quella "mappa" e la ricerca "methodToCall = aDoSomethingVTable [typeid (cosa)]", quindi chiama, ", il compilatore sta inserendo qualcosa di molto più piccolo e veloce, come" doSomethingWithAnA * A_doSomethingVTable; "seguito da" A_doSomethingTablething -> type_number"
Quindi hai ragione che C++ non ha veramente bisogno virtuale, ma lo fa aggiungere un sacco di zucchero sintattico per rendere la vita più facile, e può ottimizzare meglio troppo
che.. Detto questo, penso ancora che il C++ sia un linguaggio orribilmente sorpassato, con molte complicazioni inutili.Per esempio, Virtual potrebbe (e probabilmente dovrebbe) essere assunto per impostazione predefinita e ottimizzato laddove non necessario.Una parola chiave "override" simile a Scala sarebbe molto più utile più che "virtuale".
Suoni come se fosse necessario [un buon libro C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) –