La forma más sencilla de explicarlo es probablemente la siguiente:
virtual hace algunas operaciones de búsqueda para que, mediante la adición de una tabla de consulta virtual.
En otras palabras, si usted no tiene la palabra clave virtual, y sustituimos un método, todavía tendría que llamar a ese método manualmente [perdóname si mi memoria para sintaxis de C++ es un poco oxidado en puntos] :
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();
}
}
Usted puede optimizar esta un poco (para facilitar la lectura y el rendimiento, lo más probable), usando una tabla de consulta:
typedef doSomethingWithAnA(A::*doSomethingPtr)();
map<type_info, doSomethingWithAnA> A_doSomethingVTable;
void someOtherFuncA* thing) {
doSomethingWithAnA methodToCall = A_doSomethingVTable[typeid(thing)];
thing->(*methodToCall)();
}
Ahora, que es más de un enfoque de alto nivel. El compilador C++ obviamente puede optimizar esto un poco más, al saber exactamente qué es "type_info", y así sucesivamente. Probablemente, en lugar de ese "mapa" y la búsqueda "methodToCall = aDoSomethingVTable [typeid (thing)]", then call, ", el compilador está insertando algo mucho más pequeño y rápido, como" doSomethingWithAnA * A_doSomethingVTable; "seguido de" A_doSomethingTablething -> type_number"
Así que tienes razón en que C++ no necesita realmente virtual, pero se le añade una gran cantidad de azúcar sintáctico para hacer su vida más fácil, y puede optimizar mejor también
que.. dicho, todavía creo que C++ es un lenguaje horriblemente obsoleto, con muchas complicaciones innecesarias. Virtual, por ejemplo, podría (y probablemente debería) ser asumido por defecto, y optimizado fuera de lugar innecesario. Una palabra clave "anular" como Scala sería mucho más uso más que "virtual".
Suena como si necesitaras [un buen libro de C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) –