2016-08-23 15 views
5

У меня есть базовый класс с виртуальной функцией:Какие причины «Метод W1010«% s »скрывает виртуальный метод базового типа«% s »? Предупреждение?

TMyBaseClass = class(TObject) 
public 
    ValueOne : integer; 
    procedure MyFunction(AValueOne : integer); virtual; 
end; 

procedure TMyBaseClass.MyFunction(AValueOne : integer); 
begin 
    ValueOne := ValueOne; 
end; 

Потомок класс реализует функцию с тем же именем. Эта функция добавляет новый параметр и вызывает функцию своего оркестра.

TMyDerivedClass = class(TMyBaseClass) 
public 
    ValueTwo : integer; 
    procedure MyFunction(AValueOne : integer; AValueTwo : integer); 
end; 

procedure TMyDerivedClass.MyFunction(AValueOne : integer; AValueTwo : integer); 
begin 
    inherited MyFunction(AValueOne); 
    ValueTwo := ValueTwo; 
end; 

При составлении, следующее предупреждающее сообщение показано: W1010 Метод

«Моя_функция» скрывает виртуальный метод базового типа «TMyBaseClass»

Я нашел решение проблемы чтение another question, но мне интересно, что вызывает это предупреждение. ли TMyDerivedClass.MyFunction скрывает TMyBaseClass.MyFunction, даже если две функции имеют разные параметры? Если да, то почему?

ответ

8

The documentation объясняет этот вопрос довольно четко:

Вы объявили метод, который имеет такое же имя, как виртуальный метод в базовом классе. Ваш новый метод не является виртуальным методом; он скроет доступ к методу базы с тем же именем.

Что подразумевается под скрывается в том, что из производного класса вы больше не имеете доступ к виртуальной методе, объявленной в базовом классе. Вы не можете ссылаться на него, поскольку оно имеет то же имя, что и метод, объявленный в производном классе. И этот последний метод является тем, который виден из производного класса.

Если оба метода были отмечены директивой overload, тогда компилятор может использовать их списки аргументов для различения между ними. Без этого все, что может сделать компилятор, это скрыть базовый метод.

Прочитайте остальную связанную документацию с предложениями относительно возможных резолюций.

+0

Спасибо за ваш ответ, вы решили все мои сомнения по этому поводу. – ExDev