Red de conocimiento informático - Conocimiento sistemático - Clases derivadas y programación de funciones virtuales

Clases derivadas y programación de funciones virtuales

Su pregunta tiene algunos requisitos previos que no se indican. Por ejemplo, ¿su clase derivada redefine las funciones virtuales de la clase base?

Después de que una clase base define e implementa sus propias funciones virtuales, habrá una tabla de funciones virtuales en el área de memoria global (por así decirlo) llena de punteros a las funciones implementadas. Todos los objetos de clase base instanciados durante la ejecución del programa tienen un puntero a la tabla de funciones virtuales. El valor de este puntero es el mismo y apunta a la memoria global. Esto se debe a que cada instancia de la clase base usa el mismo código de función.

Cuando defines una clase derivada y vuelves a implementar algunas funciones virtuales, tienes que usar otra parte de la memoria global para contener la lista de punteros de funciones virtuales de la clase derivada porque implementas estas funciones de manera diferente a la clase base. En el caso más simple de derivación, la clase derivada es solo un bloque de memoria en la clase base, y luego la clase derivada utiliza más memoria. En este caso más simple, la clase derivada puede usar directamente el puntero a la lista de funciones virtuales en la clase base, pero el valor del puntero es diferente. No apunta a la lista de funciones virtuales de la clase base, sino a la lista de funciones virtuales de la clase derivada. Si no define nuevas funciones virtuales, entonces la lista de funciones virtuales de la clase derivada tendrá el mismo diseño que la clase base, excepto por los valores de las direcciones de las funciones; de lo contrario, las direcciones de las funciones recién definidas se agregarán más adelante.

A través del análisis anterior, creo que si su clase derivada no realiza ninguna reimplementación o adición a las funciones virtuales de la clase base, entonces, en teoría, puede usar la misma lista de funciones virtuales; no funciona.

Para herencia múltiple y herencia virtual, si la clase derivada define una nueva función virtual, entonces incluso necesita tener su propio puntero de tabla de funciones virtuales. Personalmente, creo que sin este puntero, no funcionará bien. . lograr.

Incluso puedes probarlo, probarlo y especular sobre cómo lo implementa Microsoft. Sin embargo, es importante distinguir entre tablas de funciones virtuales y punteros a tablas de funciones virtuales, y siento que los está confundiendo. Puede crear una instancia de una clase base y luego de una clase derivada y simplemente ver si el puntero de la función virtual apunta a una dirección.