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

Вниз

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

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

Наверх




Память: 0.5 MB
Время: 0.031 c
3-1092647561
Марат
2004-08-16 13:12
2004.09.12
Увеличение DBMemo


14-1093463375
lipskiy
2004-08-25 23:49
2004.09.12
UBPFD - единая база процедур и функций для Delphi


1-1093542362
hgd
2004-08-26 21:46
2004.09.12
Управление фотоаппаратом


14-1092978882
Cobalt
2004-08-20 09:14
2004.09.12
Выселение ГПНТБ???


3-1092832076
Kurtevich
2004-08-18 16:27
2004.09.12
Ищу БД без БДЕ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский