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

Вниз

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

 
MegaVolt   (2004-08-26 15:38) [0]

Какая разница когда прога проведёт определение адреса по которому нужно идти. Тем более статическое связывание как я понимаю быстрее. Зачем тогда применяется виртуальное переопределение?


 
Piter ©   (2004-08-26 15:41) [1]

Я если честно не понял вопроса. Вроде как речь идет о DLL? А что за виртуальное переопределение?


 
jack128 ©   (2004-08-26 15:41) [2]

Ты имеешь ввиду стат. и виртуальные методы? Или раннее и позднее связывание в OLE ?


 
MegaVolt   (2004-08-26 15:48) [3]

Я имел в виду статические и виртуальные методы.


 
jack128 ©   (2004-08-26 15:51) [4]

любая книга по любому ОО - языку..


 
MegaVolt   (2004-08-26 15:52) [5]

Я почитал но так и не просёк :( Там сказано что позволяет работать с класами о которых на момент разработки базового не было извесно. Чесно говоря это я не совсем понял :(


 
default ©   (2004-08-26 15:53) [6]

для гибкости
полиморфизм обеспечивает работу с разными сущностями единообразно


 
MegaVolt   (2004-08-26 15:55) [7]

Поставлю вопрос по другому. Что изменится если я перекрою статический метод и виртуальный? И там и там я смогу достучатся как до предка так и до потомка. И там и там я могу присваивать несколько классов переменной типа предка. В чём фишка?


 
VMcL ©   (2004-08-26 16:18) [8]

>>MegaVolt  (26.08.04 15:55) [7]

type
 TDaddy = class
   procedure Test1;
   procedure Test2; virtual;
 end;

 TSon = class(TDaddy)
   procedure Test1;
   procedure Test2; override;
 end;

procedure TDaddy.Test1;
begin
 ShowMessage("TDaddy.Test1");
end;

procedure TDaddy.Test2;
begin
 ShowMessage("TDaddy.Test2");
end;

procedure TSon.Test1;
begin
 ShowMessage("TSon.Test1");
end;

procedure TSon.Test2;
begin
 ShowMessage("TSon.Test2");
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 D, S: TDaddy;
begin
 D := TDaddy.Create;
 try
   S := TSon.Create;
   try
     D.Test1;
     D.Test2;
     S.Test1;
     S.Test2;
   finally
     S.Free;
   end;
 finally
   D.Free;
 end;
end;


P.S. Общие вопросы нужно в книгах вычитывать, а не на форум с ними ломиться.


 
MegaVolt   (2004-08-26 16:21) [9]

Люди подскажите.

вот код:

TDevice=Class
procedure Vkl;
end;

TDevice1=Class(TDevice);
procedure Vkl1;
end;

или

TDevice=Class
procedure Vkl; Virtual;
end;

TDevice1=Class(TDevice);
procedure Vkl1; Override;
end;



 
MegaVolt   (2004-08-26 16:28) [10]

Т.е. получается что я в потомке не могу перекрыть статический метод? Так что ли?


 
Гаврила ©   (2004-08-26 16:36) [11]

Если ты заранее знаешь, какой у тебя реально созданный экземпляр класса, используй статические методы, если не знаешь, а знаешь только, что это один из потомков базового класса - используй виртуальные - будет вызван метод того класса, который реально создан


 
Amoeba ©   (2004-08-26 16:37) [12]


> TDevice=Class
> procedure Vkl; Virtual;
> end;
>
> TDevice1=Class(TDevice);
> procedure Vkl1; Override;
> end;

Ерунда! Компилятор такой код обматерит. У предков TDevice1 нет виртуального метода Vkl1, который ты пытаешься перекрыть. Должно быть тогда уж
procedure Vkl; Override;
или
procedure Vkl1; virtual;

А вообще, как уже настоятельно советовали, читай "букварь". Кстати, на сайте Анатолия Подгорецкого полно хорошей литературы в электронном виде.


 
MegaVolt   (2004-08-26 16:38) [13]

Так я совсем запутался. В книге они запросто перекрывали конструктор в потомке и он вызывался. Или конструктор чем то отличается?


 
MegaVolt   (2004-08-26 16:40) [14]

А про единичку согласен лишняя. Это я описался. Так есть литературка. Я вьехать не могу. Но похоже начинаю понимать.


 
Amoeba ©   (2004-08-26 16:45) [15]


> MegaVolt   (26.08.04 16:38) [13]

Читай литературу! Тогда и распутаешься. Никто тебе в форуме не будет писать целую статью. Так, чтобы все стало понятно в нескольких словах не ответить.

P.S. Статические методы тоже можно перекрыть в потомке, но директива override не применяется.


 
GuAV ©   (2004-08-26 16:45) [16]


> В книге они запросто перекрывали конструктор в потомке и
> он вызывался.

В примере VMcL ©  мы не знаем класс, когда вызываем test1/test2, но знаем когда создаём, поэтому конструктор статический. Виртуальный нужен, когда мы не знаем заранее что создавать будем.

Читай d?dlr.hlp


 
Amoeba ©   (2004-08-26 16:49) [17]

Адреса статических методов определяются еще на стадии компиляции.
Адреса же виртуальных (а также и динамических) методов определяются только на стадии выполнения программы (они берутся из VMT - таблицы виртуальных методов класса).


 
jack128 ©   (2004-08-26 16:49) [18]


> Статические методы тоже можно перекрыть в потомке,

Фактически это создание нового метода с тем же именем..


 
MegaVolt   (2004-08-26 17:11) [19]

что то типа такого?

TDev = class
  procedure Test1;
  procedure Test2; virtual;
end;

TDev1 = class(TDev)
  procedure Test1;
  procedure Test2; override;
end;

TDev2 = class(TDev)
  procedure Test1;
  procedure Test2; override;
end;

procedure TDev.Test1;
begin
ShowMessage("TDev.Test1");
end;

procedure TDev.Test2;
begin
ShowMessage("TDev.Test2");
end;

procedure TDev1.Test1;
begin
ShowMessage("TDev1.Test1");
end;

procedure TDev1.Test2;
begin
ShowMessage("TDev1.Test2");
end;

procedure TDev2.Test1;
begin
ShowMessage("TDev2.Test1");
end;

procedure TDev2.Test2;
begin
ShowMessage("TDev2.Test2");
end;

procedure TForm1.Button1Click(Sender: TObject);
var
D:TDev;
D1:TDev1;
D2:TDev2;

begin
D:=TDev.Create;
D1 := TDev1.Create;
D2 := TDev2.Create;

D.Test1; //TDev.Test1
D.Test2; //TDev.Test2
D1.Test1; //TDev1.Test1
D1.Test2; //TDev1.Test2
D2.Test1; //TDev2.Test1
D2.Test2; //TDev2.Test2
D.Free;

D:=D1;
D.Test1; //TDev.Test1
D.Test2; //TDev1.Test2

D:=D2;
D.Test1; //TDev.Test1
D.Test2; //TDev2.Test2

D1.Free;
D2.Free;
end;


И в результатае получаем что для виртуального метода мы получим вызов процедуры из метода потомка а для статического метод предка. Так? Я правильно понял?


 
jack128 ©   (2004-08-26 17:21) [20]


> Так? Я правильно понял?

да, правильно.


 
MegaVolt   (2004-08-26 17:26) [21]

Спасибо :)


 
DiamondShark ©   (2004-08-27 13:17) [22]

Блин... А ведь хороший токарь мог бы быть.



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

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

Наверх




Память: 0.52 MB
Время: 0.022 c
1-1093695471
Don
2004-08-28 16:17
2004.09.12
Реестер


14-1093276002
dimonf
2004-08-23 19:46
2004.09.12
Народ, может кто знает конторы которые пишут софт для железа?


1-1093712107
Черный дембель
2004-08-28 20:55
2004.09.12
Параметры функций из DLL


1-1093237558
Teenager
2004-08-23 09:05
2004.09.12
Как можно создать простой справочник?


1-1093792168
Mihey_temporary
2004-08-29 19:09
2004.09.12
Проблема с записью в файл значения указателя