Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Может ли конструктор быть виртуальным?   Найти похожие ветки 

 
Ega23 ©   (2007-09-14 11:20) [0]

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


 
Anatoly Podgoretsky ©   (2007-09-14 11:30) [1]

> Ega23  (14.09.2007 11:20:00)  [0]

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


 
umbra ©   (2007-09-14 11:30) [2]

а разве они не все виртуальные начиная с TComponent?


 
ЮЮ ©   (2007-09-14 11:34) [3]

> нашёл такое у Indy,

Странно, почему не в Classes?

 TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
 ...
 public
   constructor Create(AOwner: TComponent); virtual;


 
Ega23 ©   (2007-09-14 11:40) [4]

А почему тогда у потомков TComponent конструкторам override не ставят?


 
umbra ©   (2007-09-14 11:43) [5]

да ставят, вроде, когда перекрывают.


 
Сергей М. ©   (2007-09-14 11:46) [6]


> почему тогда у потомков TComponent конструкторам override
> не ставят?


Пример ?..


 
ЮЮ ©   (2007-09-14 11:47) [7]

> А почему тогда у потомков TComponent конструкторам override
> не ставят?


А то, что, не ставя override, вовсю используют inherited, не смущает? :)


 
umbra ©   (2007-09-14 12:00) [8]


> А то, что, не ставя override, вовсю используют inherited,
>  не смущает?

а как относится inherited к виртуальности?


 
evvcom ©   (2007-09-14 12:21) [9]


> а как относится inherited к виртуальности?

А может букварь почитать?


 
umbra ©   (2007-09-14 12:28) [10]


> А может букварь почитать?
>

а может я уже почитал? Вы хотите сказать что нижеприведенный код сожержит ошибку?

TMyObject = class
 public
   constructor Create;
end;

{ ...........................}
constructor TMyObject.Create;
begin
 inherited;
end;


 
ЮЮ ©   (2007-09-14 12:47) [11]

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

type
 TMyObject = class(TObject)
public
  function ClassType: TClass;
end;

function TMyObject.ClassType: TClass;
begin
 Result := inherited ClassType;
end;


Т.е. можно обойтись безо всяких virtual и dynamic?


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

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

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


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


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


то-то и оно


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


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

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


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


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

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


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


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


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


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


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

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


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

> Но зачем?

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

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

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

Это мое имхо.


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


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

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


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

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


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


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

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


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

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

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


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


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

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


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

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


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

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 и снова. Теперь думаем, почему так получилось.


 
Kolan ©   (2007-09-15 10:47) [26]

> Инс ©   (15.09.07 00:54)

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

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

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


 
oxffff ©   (2007-09-15 11:24) [27]



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

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


 
Инс ©   (2007-09-16 11:39) [29]


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

См. [1],[16]


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


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

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;


 
ANTPro ©   (2007-09-16 22:39) [31]

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


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

Это понятно.


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.021 c
1-1185968425
Alexey 12
2007-08-01 15:40
2007.10.14
Как узнать, что файл не используется другой программой?


15-1190128267
VirEx
2007-09-18 19:11
2007.10.14
Российская demoкратия (с)


1-1185876024
Solo
2007-07-31 14:00
2007.10.14
А где модуль ShareMem в Delphi 2006?


2-1189774498
tytus
2007-09-14 16:54
2007.10.14
Есть ли альтернатива GetHostByAddr ???


15-1189675794
Ega23
2007-09-13 13:29
2007.10.14
Как иконку компоненту добавить?