[Tutto il seguente è stata testata utilizzando Visual Studio 2008 SP1]C++ vs. C++/CLI: qualificazione Const di funzione virtuale parametri
In C++, qualificazione const dei tipi di parametri non influisce sul tipo di una funzione (8.3.5/3: "Ogni cv-qualificazione modifica di un tipo di parametro viene cancellato")
Così, per esempio, nel seguente gerarchia di classe, Derived::Foo
override Base::Foo
:
struct Base
{
virtual void Foo(const int i) { }
};
struct Derived : Base
{
virtual void Foo(int i) { }
};
consideri una gerarchia simile a 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 { }
};
Se poi creare un'istanza di Derived
:
int main(array<System::String ^> ^args)
{
Derived^ d = gcnew Derived;
}
compila senza errori o avvisi. Quando l'eseguo, viene generata la seguente eccezione e quindi termina:
An unhandled exception of type 'System.TypeLoadException' occurred in ClrVirtualTest.exe
Additional information: Method 'Foo' in type 'Derived'...does not have an implementation.
Tale eccezione sembra indicare che la qualifica const del parametro non influenza il tipo di funzione in C++/CLI (o, meno influisce in qualche modo sull'override). Tuttavia, se io commento la riga che contiene la definizione di Derived::Foo
, il compilatore segnala il seguente errore (sulla linea in main
dove viene istanziato l'istanza di Derived
):
error C2259: 'Derived': cannot instantiate abstract class
Se aggiungo il qualificatore const alla parametro di Derived::Foo
o rimuovere il qualificatore const dal parametro di Base::Foo
, esso viene compilato ed eseguito senza errori.
Penso che se la qualifica const del parametro influenza il tipo della funzione, dovrei ottenere questo errore se la qualifica const del parametro nella funzione virtuale della classe derivata non corrisponde alla qualifica const del parametro in la funzione virtuale della classe base.
Se cambio il tipo di parametro Derived::Foo
s' da un int
ad un double
, ottengo il seguente avviso (oltre all'errore di cui sopra, C2259):
warning C4490: 'override': incorrect use of override specifier; 'Derived::Foo' does not match a base ref class method
Quindi, la mia domanda è, efficacemente, la qualifica const dei parametri di funzione influenza il tipo di funzione in C++/CLI? In tal caso, perché viene compilato e perché non ci sono errori o avvertimenti? In caso contrario, perché viene lanciata un'eccezione?
Aggiornamento: ho segnalato questo come un bug su Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/540788 (Ho copiato il link qui dalla discussione qui sotto poiché era sepolto nella conversazione) –
Un membro del team di compilatore Microsoft C++/CLI ha confermato dal 21 marzo che si tratta di un bug e stanno esplorando l'impatto di una correzione sul codice esistente. –
@ Ben: Grazie. Il difetto che ho presentato su Microsoft Connect è stato chiuso oggi come "non risolverà". "Ciao: grazie per aver segnalato questo problema. Sfortunatamente sulla base della nostra analisi della gravità di questo problema combinata con le nostre risorse limitate, non saremo in grado di risolvere questo problema nella prossima versione di Visual C++." Oh bene :-) –