Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Перегрузка виртуального метода  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9870
Есть два класса
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'

Есть какой-то цивилизованный способ подавить ворнинг кроме
{WARN HIDDEN_VIRTUAL OFF}


На такой класс
TChild2 = class(TBase)
public
  procedure Test; overload; override;
  procedure Test(AVal: Integer); overload;
end;

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


С уважением, Vasilisk
14 ноя 17, 19:11    [20953999]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9870
Нашел такой способ
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;
насколько это кошерно?
14 ноя 17, 19:12    [20954006]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
чччД
Guest
_Vasilisk_,

прикалываешься?
14 ноя 17, 19:14    [20954009]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
Лись
Guest
Просто базовый пометь как overload:

TBase = class
public
  procedure Test; overload; virtual;
end;
14 ноя 17, 19:15    [20954012]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9870
чччД
прикалываешься?
Не
Лись
Просто базовый пометь как overload:
Вариант, конечно. Но как бы базовый метод не обязан знать, что его будут перегружать в наследнике
14 ноя 17, 19:29    [20954042]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
alekcvp
Member

Откуда:
Сообщений: 472
_Vasilisk_
насколько это кошерно?

Ну эта директива просто подтверждает компилятору, что вы знаете что делаете, и точно так же тупо давит предупреждение.
14 ноя 17, 20:24    [20954160]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
schi
Member

Откуда: Москва
Сообщений: 2310
_Vasilisk_
Нашел такой способ
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;
насколько это кошерно?


Абсолютно кошерно. Когда надо в наследнике Tcomponent применить конструктор с аргументами, отличающимися от стандартного Create (AOwner: TComponent) слово reintroduce пишется на автомате.
14 ноя 17, 21:14    [20954298]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
schi
Member

Откуда: Москва
Сообщений: 2310
Только overload после reintroduce не надо писать
14 ноя 17, 21:16    [20954306]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9870
schi
Только overload после reintroduce не надо писать
Мне нужно именно overload. Т.е. в наследнике я хочу видеть два перегруженных метода. Один виртуальный из родителя (быть может переопределенный в наследнике), а второй невиртуальный из наследника
15 ноя 17, 15:31    [20956601]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
alekcvp
Member

Откуда:
Сообщений: 472
_Vasilisk_,

type
  TBase = class
    procedure Test; overload; virtual;
  end;

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

В 7ке нормально работает.
15 ноя 17, 16:11    [20956857]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
alekcvp
Member

Откуда:
Сообщений: 472
_Vasilisk_
Вариант, конечно. Но как бы базовый метод не обязан знать, что его будут перегружать в наследнике

Как бы компилятор обязан знать, какие методы будут перегружать. Иначе потребуются извращения и хаки.
15 ноя 17, 16:12    [20956866]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
schi
Member

Откуда: Москва
Сообщений: 2310
_Vasilisk_
schi
Только overload после reintroduce не надо писать
Мне нужно именно overload. Т.е. в наследнике я хочу видеть два перегруженных метода. Один виртуальный из родителя (быть может переопределенный в наследнике), а второй невиртуальный из наследника


Я бы у второго (невиртуального в наследнике) поменял имя и не парился бы.
15 ноя 17, 18:05    [20957416]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
Уважаемый автор
Member

Откуда: Питер
Сообщений: 225
_Vasilisk_,
TBase = class
public
  procedure Test; virtual;
end;

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


вот так надо!
15 ноя 17, 21:54    [20958030]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9870
Уважаемый автор
вот так надо!
Так не надо
[dcc32 Error]E2037 Declaration of 'Test' differs from previous declaration
вчера, 21:29    [20976321]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 931
_Vasilisk_
Нашел такой способ
TChild = class(TBase)
public
  procedure Test(AVal: Integer); reintroduce; overload;
end;
насколько это кошерно?

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

Из справки
help
An override declaration must match the ancestor declaration in the order and type of its parameters and in its result type (if any).

help
Use reintroduce when you want to hide an inherited virtual method with a new one

Если вы хотите чтобы 2 метода объявленные в разных классах, один из которых наследник второго, были видны другим наследникам, то оба метода объявляете override.
Если вы хотите, чтобы эти методы могли изменять в наследниках, то добавляете еще virtual.
Если вы хотите для последующих наследников скрыть базовую реализацию в базовом классе и оставить видимой последнюю, то используете reintroduce
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;


Цель то какая?
вчера, 22:10    [20976397]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 931
Насколько я понял Test4 же ваш случай? Вот так и будет кошерно...
вчера, 22:18    [20976424]     Ответить | Цитировать Сообщить модератору
 Re: Перегрузка виртуального метода  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9870
X-Cite
Если вы хотите чтобы 2 метода объявленные в разных классах, один из которых наследник второго, были видны другим наследникам, то оба метода объявляете override.
Дальше можно не читать. Нельзя указать override для невиртуального метода
X-Cite
Если вы хотите для последующих наследников скрыть базовую реализацию в базовом классе и оставить видимой последнюю, то используете reintroduce
Вы удивитесь, но reintroduce overload работает именно так как мне нужно. Видны два перегруженных метода один из которых виртуальный
сегодня, 00:55    [20976657]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить