2010-03-09 35 views
14

Cuando se habla de clases selladas, el término "tabla de funciones virtuales" se menciona con bastante frecuencia. ¿Qué es esto exactamente? Hace un tiempo leí acerca de una tabla de métodos (no recuerdo el propósito del propósito de esto tampoco) y una búsqueda en google aquí muestra los resultados relacionados con C++.Tablas de métodos virtuales

Gracias

Respuesta

4

La tabla de función virtual C# funciona básicamente el mismo que el C++ uno, por lo que cualquier recurso que describen cómo funciona la tabla de funciones virtuales del C++ deben ayudarle bastante bien con la C# uno también.

Por ejemplo, Wikipedia's description no está nada mal.

0

La definición de Tabla de funciones virtuales (a menudo llamada vtable) es la misma en C# y C++. Es una tabla de búsqueda utilizada internamente por el tiempo de ejecución para lograr los comportamientos polimórficos del método abstracto/virtual/anular.

En simple, se puede imaginar una clase base con un método virtual. A tendrá un vtable que contenga el método A. Cuando se deriva el método A de sustitución de clase, el vtable para methodA hereda de la clase padre, pero ahora apunta al método A en la clase derivada en lugar de la clase padre.

19

La "tabla de funciones virtuales" o "tabla de métodos virtuales" es una lista de punteros de método que tiene cada clase. Contiene punteros a los métodos virtuales en la clase.

Cada instancia de una clase tiene un puntero a la tabla, que se usa cuando se llama a un método virtual desde la instancia. Esto se debe a que una llamada a un método virtual debe llamar al método asociado con la clase del objeto real, no a la clase de la referencia al objeto.

Si, por ejemplo, tiene una referencia de objeto a una cadena:

object obj = "asdf"; 

y llama al método ToString virtuales:

string text = obj.ToString(); 

se utilizará el método de String.ToString, no el objeto. Método ToString. Está utilizando la tabla de métodos virtuales de la clase String (a la que apunta el puntero en la instancia de cadena), no la tabla de métodos virtuales de la clase Object.

+0

Entiendo correctamente que se crea una "tabla de métodos" para cualquier tipo. Entonces, ese tipo de valor también tiene una "tabla de métodos". Y una pregunta más ¿cómo se sabe que un tipo tiene una "tabla de métodos"? ¿La "tabla de métodos" está almacenada o referenciada en un objeto tipo? Pero el tipo de valor no tiene un puntero de tipo de objeto. :/Aquí hay una pregunta relacionada: http://stackoverflow.com/questions/35185528/does-a-value-type-keep-type-pointer-sync-root-static-fields-like-a-reference/35185851# 35185851 – Spirit

+2

@Spirit: Sí, cada tipo tiene una tabla de métodos (al menos de alguna forma en algún momento). Como las llamadas para los tipos de valor no son virtuales, los métodos exactos se determinan en tiempo de compilación, por lo que no necesitan una tabla de métodos virtuales, para ellos solo debería existir en el ejecutable para propósitos de reflexión. No sé dónde se almacenan realmente las tablas de métodos, que dependería de la implementación, así que buscaría en el código fuente del marco para eso (sin embargo, esa parte de la implementación podría no ser pública). – Guffa

+0

Gracias. Tu respuesta es muy clara. Finalmente encontré una discusión SO similar: http://stackoverflow.com/questions/926352/how-is-valuetype-gettype-able-to-determine-the-type-of-the-struct – Spirit

Cuestiones relacionadas