[Все перечисленные ниже были протестированы с использованием Visual Studio 2008 SP1]
В С++ константная конфигурация типов параметров не влияет на тип функции (8.3.5/3: "Любой cv-классификатор, изменяющий тип параметра, удаляется" )
Итак, например, в следующей иерархии классов Derived::Foo
переопределяет Base::Foo
:
struct Base
{
virtual void Foo(const int i) { }
};
struct Derived : Base
{
virtual void Foo(int i) { }
};
Рассмотрим аналогичную иерархию в С++/CLI:
ref class Base abstract
{
public:
virtual void Foo(const int) = 0;
};
ref class Derived : public Base
{
public:
virtual void Foo(int i) override { }
};
Если я затем создаю экземпляр Derived
:
int main(array<System::String ^> ^args)
{
Derived^ d = gcnew Derived;
}
он компилируется без ошибок или предупреждений. Когда я запускаю его, он выдает следующее исключение, а затем завершает:
Необработанное исключение типа "System.TypeLoadException" произошло в ClrVirtualTest.exe
Дополнительная информация: Метод "Foo" в типе "Производный"... не имеет реализации.
Это исключение, по-видимому, указывает на то, что константная спецификация параметра влияет на тип функции в С++/CLI (или, по крайней мере, это влияет на переопределение каким-либо образом). Однако, если я прокомментирую строку, содержащую определение Derived::Foo
, компилятор сообщает следующую ошибку (в строке в main
, где экземпляр Derived
создается):
ошибка C2259: "Производится": не может создать абстрактный класс
Если я добавлю спецификатор const к параметру Derived::Foo
или удалю классификатор const из параметра Base::Foo
, он компилируется и запускается без ошибок.
Я бы подумал, что если константная характеристика параметра влияет на тип функции, я должен получить эту ошибку, если const-характеристика параметра в виртуальной функции производного класса не соответствует константной спецификации параметра в виртуальная функция базового класса.
Если изменить тип параметра Derived::Foo
с int
на double
, я получаю следующее предупреждение (в дополнение к вышеупомянутой ошибке C2259):
предупреждение C4490: "переопределение": неправильное использование спецификатора переопределения; 'Derived:: Foo' не соответствует методу базового класса ref
Итак, мой вопрос заключается в том, влияет ли const-функция параметров функции на тип функции в С++/CLI? Если да, то почему это компилируется и почему нет ошибок или предупреждений? Если нет, почему выбрано исключение?