Una clase virtual es una clase que se asigna solo una vez en la memoria, de modo que los hijos de esa clase usan solo la copia de esa clase principal que está establecida en la memoria. Una clase es un grupo de objetos que comparten rasgos o atributos comunes. Hacer que una clase sea virtual brinda a los lenguajes de programación orientados a objetos la capacidad de usar herencia múltiple cuando las clases principales de segunda o más generaciones se derivan de clases base ancestrales comunes. Dependiendo del lenguaje de programación de computadoras al que se haga referencia, la palabra clave «virtual», la palabra clave similar o la sintaxis y la semántica de una clase se utilizan para implicar que una clase en particular debe considerarse virtual.
No todos los lenguajes de programación orientados a objetos permiten la herencia múltiple, que es cuando una clase secundaria puede derivarse de varias clases principales al mismo tiempo. En un lenguaje de programación como C ++, una clase puede heredar todos los datos de los miembros y las funciones de los miembros de ambas clases principales a la vez y tener acceso a ambos conjuntos de datos y funciones principales. Otros lenguajes que admiten herencia múltiple incluyen Perl, Python, Tcl y Eiffel.
Se produce un problema en varias jerarquías de herencia cuando dos o más clases principales utilizadas para crear una clase secundaria se derivan originalmente de solo una o la misma clase de abuelos. A esto se le llama el problema del diamante, el nombre proviene de cómo se vería la jerarquía en esta situación. Cuando un programa compilador intenta crear una instancia de una clase, como una clase de nieto hecha de dos clases padre con un abuelo común, se hacen dos copias del abuelo en la memoria, una para cada padre.
Debido a la ambigüedad causada por múltiples copias del mismo abuelo en la memoria, el compilador no puede determinar qué copia del abuelo debe usar el nieto para acceder a los datos o funciones de los abuelos. Para remediar esta situación, en C ++ el abuelo se convierte en una clase virtual al declarar a los padres. Esto hace que el compilador solo haga una copia del abuelo en la memoria que comparten ambos padres. Una vez que el abuelo se ha convertido en una clase virtual, el compilador no tiene problemas para decidir cómo el nieto debe acceder al abuelo porque solo hay una copia del abuelo.
Se debe tener mucho cuidado al estructurar las jerarquías de clases, especialmente cuando se incluirán o se convertirán en la base de jerarquías mucho más grandes en el futuro. La utilización adecuada de una clase virtual da a las jerarquías de clases una mayor libertad de desarrollo; sin embargo, tienen el potencial de causar errores que son difíciles de localizar. El estudio de principios sólidos de ingeniería de programación de computadoras ayudará a asegurar que no ocurran efectos secundarios inesperados de una organización inadecuada del programa.