Colección de citas famosas - Mensajes de felicitación - ¿Por qué es necesario cubrir las soluciones de palabras clave?

¿Por qué es necesario cubrir las soluciones de palabras clave?

C++ no tiene esta palabra clave. Al declarar una función virtual, solo necesita agregar la palabra clave virtual antes de la declaración de la función, pero cuando la función virtual está sobrecargada, virtual es opcional. Incluso si virtual está escrito en la subclase, no está claro si esta función se declara por primera vez o si es una función virtual sobrecargada en la clase base. Lo que es más grave es que sin mirar la declaración de la clase base o usar comentarios, no hay forma de saber si una función es virtual (quiero decir, los programadores no lo saben cuando miran el código fuente, y los métodos de tiempo de ejecución son fuera del alcance de esta discusión). Una vez que ordené el código C++ que escribí hace unos meses y vi que una de las funciones miembro de la clase acababa de devolver el valor de una variable miembro. Creo que dichas funciones miembro deberían declararse como constantes, lo que también se puede aplicar en el caso de instancias constantes. Pero en este caso, los resultados de ejecución del programa serán incorrectos. Después de un seguimiento cuidadoso, descubrí que esta función se declaró originalmente como una función virtual en la clase base, y la versión en la subclase era en realidad una versión sobrecargada. Sin embargo, después de agregar const, su firma era diferente de la de la base. clase, por lo que el compilador ya no piensa que está sobrecargando una función virtual en la clase base, sino una función completamente nueva. El compilador no puede proporcionar ninguna información útil al respecto y sólo puede comprobarlo manualmente poco a poco. Pero si se requiere la palabra clave C# como C#, entonces se debe anular la versión sobrecargada en la subclase, de modo que pueda saber de un vistazo que es un método sobrecargado y no cambiaremos su firma a voluntad.

Los requisitos de anulación son:

1 Para métodos no sobrecargados, la palabra clave de anulación no se puede agregar; de lo contrario, se producirá un error de compilación.

2 Para métodos sobrecargados, debe usar la palabra clave override; si desea ocultar métodos en la clase base, debe usar la palabra clave new.

3 Con el IDE, simplemente ingrese override y espacio en Visual Studio.Net, y todos los métodos sobrecargados en la clase base se enumerarán automáticamente.

En este sentido, creo que es posible simular la función de la palabra clave override con la ayuda de la función typedef, plantilla o macro de C++.

Una idea mía no formada es:

1 Definir virtual como VIRTUAL y luego definir el nombre de la función virtual escrita como ilegal. Sobrecargarlo directamente en una subclase dará como resultado una compilación. error de tiempo.

2 Para definir OVERRIDE, primero verifique si el nombre de la función sobrecargada tiene una definición ilegal. De lo contrario, defina un resultado ilegal, lo que provocará un error en tiempo de compilación, de modo que la palabra clave OVERRIDE no se pueda aplicar a no. -funciones sobrecargadas.

Si hay una definición ilegal, primero cancele la definición ilegal del nombre de la función sobrecargada, luego vuelva a cargarla normalmente y luego redefina ilegalmente nuevamente, para que la función virtual se pueda recargar correctamente.

Pero todavía hay algunos problemas, es decir, al escribir la implementación de funciones sobrecargadas, habrá algunos problemas al llamar a funciones declaradas de esta manera, porque el nombre de la función correspondiente se ha definido como ilegal y no puede ser utilizado directamente. Es posible que se requiera una definición de macro más compleja para resolverlo.

Esta es la idea, pero hay muchos problemas en su implementación. Todavía no he tenido éxito con el experimento, así que guardo mi idea aquí para consultarla en el futuro.