powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перегрузка виртуального метода
18 сообщений из 18, страница 1 из 1
Перегрузка виртуального метода
    #39553053
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть два класса
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TBase = class
public
  procedure Test; virtual;
end;

TChild = class(TBase)
public
  procedure Test(AVal: Integer); overload;
end;



На второй метод компилятор выдает ворнинг
[dcc32 Warning]W1010 Method 'Test' hides virtual method of base type 'TBase'
Есть какой-то цивилизованный способ подавить ворнинг кроме
Код: pascal
1.
{WARN HIDDEN_VIRTUAL OFF}



На такой класс
Код: pascal
1.
2.
3.
4.
5.
TChild2 = class(TBase)
public
  procedure Test; overload; override;
  procedure Test(AVal: Integer); overload;
end;


на выделенной строке тот же ворнинг


С уважением, Vasilisk
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553057
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел такой способ
Код: pascal
1.
2.
3.
4.
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;

насколько это кошерно?
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553059
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

прикалываешься?
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553060
Лись
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто базовый пометь как overload:

Код: pascal
1.
2.
3.
4.
TBase = class
public
  procedure Test; overload; virtual;
end;
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553070
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДприкалываешься?Не
ЛисьПросто базовый пометь как overload:Вариант, конечно. Но как бы базовый метод не обязан знать, что его будут перегружать в наследнике
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553101
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_насколько это кошерно?
Ну эта директива просто подтверждает компилятору, что вы знаете что делаете, и точно так же тупо давит предупреждение.
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553117
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Нашел такой способ
Код: pascal
1.
2.
3.
4.
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;

насколько это кошерно?

Абсолютно кошерно. Когда надо в наследнике Tcomponent применить конструктор с аргументами, отличающимися от стандартного Create (AOwner: TComponent) слово reintroduce пишется на автомате.
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553119
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только overload после reintroduce не надо писать
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553629
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiТолько overload после reintroduce не надо писатьМне нужно именно overload. Т.е. в наследнике я хочу видеть два перегруженных метода. Один виртуальный из родителя (быть может переопределенный в наследнике), а второй невиртуальный из наследника
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553670
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
type
  TBase = class
    procedure Test; overload; virtual;
  end;

  TPuppy = class(TBase)
    procedure Test(A: Integer); overload;
  end;


В 7ке нормально работает.
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553671
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Вариант, конечно. Но как бы базовый метод не обязан знать, что его будут перегружать в наследнике
Как бы компилятор обязан знать, какие методы будут перегружать. Иначе потребуются извращения и хаки.
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553784
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_schiТолько overload после reintroduce не надо писатьМне нужно именно overload. Т.е. в наследнике я хочу видеть два перегруженных метода. Один виртуальный из родителя (быть может переопределенный в наследнике), а второй невиртуальный из наследника

Я бы у второго (невиртуального в наследнике) поменял имя и не парился бы.
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39553896
Уважаемый автор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
TBase = class
public
  procedure Test; virtual;
end;

TChild = class(TBase)
public
  procedure Test(AVal: Integer); overload; override;
end;



вот так надо!
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39557878
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый авторвот так надо!Так не надо
[dcc32 Error]E2037 Declaration of 'Test' differs from previous declaration
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39557904
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Нашел такой способ
Код: pascal
1.
2.
3.
4.
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;

насколько это кошерно?
Грустно.... Когда задают такие вопросы... особенно опытные... на собеседовании я бы закончил разговор.

Из справки
helpAn override declaration must match the ancestor declaration in the order and type of its parameters and in its result type (if any).
helpUse reintroduce when you want to hide an inherited virtual method with a new one
Если вы хотите чтобы 2 метода объявленные в разных классах, один из которых наследник второго, были видны другим наследникам, то оба метода объявляете override.
Если вы хотите, чтобы эти методы могли изменять в наследниках, то добавляете еще virtual.
Если вы хотите для последующих наследников скрыть базовую реализацию в базовом классе и оставить видимой последнюю, то используете reintroduce
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
TA = class
  public
    procedure Test1; virtual;
    procedure Test2; overload; virtual;
    procedure Test3; virtual;
    procedure Test4; virtual;
  end;

  TB = class(TA)
  public
    procedure Test1(const aParam: Int32); reintroduce; virtual;
    procedure Test2(const aParam: Int32); overload; virtual;
    procedure Test3; override;
    procedure Test4; overload; override;
    procedure Test4(const aParam: Int32); reintroduce; overload; virtual;
  end;

  TC = class(TB)
  public
    procedure Test1(const aParam: Int32); override;
    procedure Test2; override;
    procedure Test2(const aParam: Int32); override;
    procedure Test3; override;
    procedure Test4; override;
    procedure Test4(const aParam: Int32); overload; override;
  end;



Цель то какая?
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39557907
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял Test4 же ваш случай? Вот так и будет кошерно...
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39557966
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЕсли вы хотите чтобы 2 метода объявленные в разных классах, один из которых наследник второго, были видны другим наследникам, то оба метода объявляете override.Дальше можно не читать. Нельзя указать override для невиртуального метода
X-CiteЕсли вы хотите для последующих наследников скрыть базовую реализацию в базовом классе и оставить видимой последнюю, то используете reintroduceВы удивитесь, но reintroduce overload работает именно так как мне нужно. Видны два перегруженных метода один из которых виртуальный
...
Рейтинг: 0 / 0
Перегрузка виртуального метода
    #39558576
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Вы удивитесь, но reintroduce overload работает именно так как мне нужно. Видны два перегруженных метода один из которых виртуальный
да, меня это тоже удивляло - две как бы противоположные по смыслу директивы
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перегрузка виртуального метода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]