Форум: "Начинающим";
Текущий архив: 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] ) наверно первая с конца по важности…
← →
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