[Todo lo siguiente se ensayó usando Visual Studio 2008 SP1]C++ vs. C++/CLI: calificación Const de función virtual Parámetros
En C++, calificación const de tipos de parámetros no afecta al tipo de una función (8.3.5/3: "Cualquier cv-calificador la modificación de un tipo de parámetro se elimina")
Así, por ejemplo, en la siguiente jerarquía de clases, Derived::Foo
anulaciones Base::Foo
:
struct Base
{
virtual void Foo(const int i) { }
};
struct Derived : Base
{
virtual void Foo(int i) { }
};
Considérese una jerarquía similar en C++/CLI:
ref class Base abstract
{
public:
virtual void Foo(const int) = 0;
};
ref class Derived : public Base
{
public:
virtual void Foo(int i) override { }
};
Si a continuación, crear una instancia de Derived
:
int main(array<System::String ^> ^args)
{
Derived^ d = gcnew Derived;
}
se compila sin errores o advertencias. Cuando lo ejecuto, se lanza la siguiente excepción y luego termina:
An unhandled exception of type 'System.TypeLoadException' occurred in ClrVirtualTest.exe
Additional information: Method 'Foo' in type 'Derived'...does not have an implementation.
Esa excepción parece indicar que la calificación const del parámetro no afecta al tipo de la función en C++/CLI (o, por lo al menos afecta a la anulación de alguna manera). Sin embargo, si me comente la línea que contiene la definición de Derived::Foo
, el compilador informa el siguiente error (en la línea en main
donde se crea una instancia de la instancia de Derived
):
error C2259: 'Derived': cannot instantiate abstract class
Si añado el calificador const a la parámetro de Derived::Foo
o elimine el calificador const del parámetro Base::Foo
, se compila y se ejecuta sin errores.
Creo que si la calificación const del parámetro afecta el tipo de la función, debería obtener este error si la calificación const del parámetro en la función virtual de clase derivada no coincide con la calificación const del parámetro en la función virtual de la clase base.
Si cambio el tipo de parámetro de un int
Derived::Foo
's a una double
, me sale el siguiente aviso (además del error antes mencionado, C2259):
warning C4490: 'override': incorrect use of override specifier; 'Derived::Foo' does not match a base ref class method
Por lo tanto, mi pregunta es, efectivamente, ¿la constificación de los parámetros de la función afecta el tipo de la función en C++/CLI? Si es así, ¿por qué compila esto y por qué no hay errores o advertencias? Si no, ¿por qué se lanza una excepción?
Actualización: He informado de esto como un error en Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/540788 (he copiado el enlace aquí desde la discusión a continuación, ya que fue enterrado en la conversación) –
Un miembro del equipo del compilador de Microsoft C++/CLI confirmó a partir del 21 de marzo que es un error y está explorando el impacto de una corrección en el código existente. –
@Ben: Gracias. El defecto que presenté en Microsoft Connect se cerró hoy como "no se solucionará". "Hola: gracias por informar sobre este problema. Desafortunadamente, de acuerdo con nuestro análisis de la gravedad de este problema combinado con nuestros recursos limitados, no podremos solucionar este problema en la próxima versión de Visual C++". Oh, bueno :-) –