Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Может ли конструктор быть виртуальным? [D7]


Страницы:   1 2

Ega23 ©   (2007-09-14 11:20:00) 

нашёл такое у Indy, конкретно - TformAbout = class(TForm)?
Т.е. что может быть - это понятно. Но зачем?


ANTPro   (2007-09-16 22:39:00) [1]

Очепятался я сорри %)


> [25] Инс ©   (15.09.07 00:54)

Это понятно.


> [27] oxffff ©   (15.09.07 11:24)

Это баг или сообщение действительно пустое?


jack128_   (2007-09-16 11:45:00) [2]


> Не могу понять

type
 TControlClass = class of TControl;
procedure TForm1.Button1Click(Sender: TObject);
var
 ControlClass: TControlClass;
begin
 case IndexText(UpperCase(edControlName.Text), ['EDIT', 'MEMO', 'BUTTON']) of
   0: ControlClass := TEdit;
   1: ControlClass := TMemo;
   2: ControlClass := TButton;
 else
   raise Exception.CreateFmt('Invalid control (%s)', [edControlName.Text]);
 end;
 // Если бы конструктор у TControl не был бы виртуальным,
 // то всегда бы создовался экземпляр TControl со всеми вытекающими..
 ControlClass.Create(Self).Parent := Self;
end;


Инс   (2007-09-16 11:39:00) [3]


> Не могу понять зачем нужен виртуальный конструктор

См. [1],[16]


SKIPtr   (2007-09-16 10:45:00) [4]

Не могу понять зачем нужен виртуальный конструктор Виртуальным методом можно через предка запустить потомка Конструктор нельзя запускать через предка иначе создан будет предок
Или это уже не так


oxffff   (2007-09-15 11:24:00) [5]


Kolan   (2007-09-15 10:47:00) [6]

> Инс ©   (15.09.07 00:54)

Я знаю что такое полиморфизм.

И без виртуальности будет работать.
Нет не будет если я забуду вызвать inherited, разница в том, что в случае с виртуальным методом компилятор выдасть соотв хинт(который убирается использованием reintroduce), а в случае с не вирт методом хинта не будет.

ЗЫ
 Эта причина ([18] ) наверно первая с конца по важности…


Инс   (2007-09-15 00:54:00) [7]

evvcom, Kolan, ANTPro - информация к размышлению:

TA = class
public
 procedure Proc1; virtual;
 procedure Proc2;
end;

TB = class(TA)
public
 procedure Proc1; override;
end;

...

procedure TA.Proc1;
begin
 ShowMessage('A');
end;

procedure TA.Proc2;
begin
 Proc1;
end;

procedure TB.Proc1;
begin
 ShowMessage('B');
end;

Создаем экземпляр TB и вызываем метод Proc2. А теперь убираем virtual и override и снова. Теперь думаем, почему так получилось.


Плохиш   (2007-09-15 00:51:00) [8]

Даже "последнего наследника" :-)


Плохиш   (2007-09-15 00:49:00) [9]


> virtual - возможность вызова метода родителя.

А в справке написано "наследника".


Anatoly Podgoretsky   (2007-09-15 00:48:00) [10]

> ANTPro  (15.09.2007 00:34:20)  [20]

virtual - кажется одно, вызывается другое.


Инс   (2007-09-15 00:46:00) [11]


> virtual - возможность вызова метода родителя.

НЕТ! Я метод предка и статический вызвать могу. Фишка виртуальных методов в поздем связывании. Срочно читать учебник!


ANTPro   (2007-09-15 00:34:00) [12]

inherited - вызов метода родителя.
virtual - возможность вызова метода родителя.


Инс   (2007-09-15 00:04:00) [13]


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

И без виртуальности будет работать.


Kolan   (2007-09-15 00:03:00) [14]

> Но зачем?

Как одну из причин я вижу такую:
Допустим в конструкторе предка выполняются действия без которых потомок работать не будет(Например создается список в котором будут содерзаться подключенные Обозреватели).

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

А в случае с вирт конструктором будет хинт.

Это мое имхо.


Плохиш   (2007-09-14 23:08:00) [15]


> > а как относится inherited к виртуальности?
>
> А может букварь почитать?

В моём букваре в описании inherited никаких виртуальностей не упоминается. Расскажите про свой букварь?


Инс   (2007-09-14 16:38:00) [16]


> Ну например для создания объекта через классовую ссылку.


Я бы даже сказал более категорично: толькодля создание экземпляра через классовую ссылку. Других примеров не знаю.


evvcom   (2007-09-14 15:21:00) [17]


> umbra ©   (14.09.07 12:28) [10]

Согласен, не содержит.


DiamondShark   (2007-09-14 13:45:00) [18]


> Да уж. Как-то не ожидал, что и такое проскочит без hint-
> ов и message-й:

А чего бы ему не проскочить?
Везде статические методы.


Ega23   (2007-09-14 13:30:00) [19]


> Да уж. Как-то не ожидал, что и такое проскочит без hint-
> ов и message-й:


то-то и оно


Anatoly Podgoretsky   (2007-09-14 12:51:00) [20]

> ЮЮ  (14.09.2007 12:47:11)  [11]

Так inherited не имеет никакого отношение к виртуальности, более того виртуальность не имеет к этому совсем отношения. Будет вызван именно метод предка.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо