Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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


 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.058 c
2-1190485834
Aser
2007-09-22 22:30
2007.10.14
Как вывести хинт (сообщение) в трэй - т.н. "baloon"


15-1189862319
Comunicator
2007-09-15 17:18
2007.10.14
Реально ли по мобильному номеру


15-1189604306
wvalera
2007-09-12 17:38
2007.10.14
FastMM


1-1186038494
DevilDevil
2007-08-02 11:08
2007.10.14
Указатель на виртуальную функцию. Помогите.


15-1190103143
Jeer
2007-09-18 12:12
2007.10.14
Кому нужен BlackFish SQL (риторический вопрос)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский