Виртуален деструктор
75 отговора
0 прегледа
Виртуален деструктор
С++. По стандарт, ако се опитаме да изтрием обект от наследен клас чрез указател към базов клас, при положение че деструкторът на базовия клас НЕ е виртуален, резултатът е НЕОПРЕДЕЛЕН. Защо неопределен, питам аз? И защо в такъв случай не са забранили на базовите класове да имат невиртуални деструктори? От съображения за ефективност ли само? Имаш дефицит на памет, правиш невиртуален деструктор на някакъв клас, за да пестиш ... И после го наследяваш и внимаваш, не че е невъзможно да възникнат такива ситуации, ама пък въпрос на дизайн, ако забранят базовите класове да имат невиртуални деструктори, дизайнът ще се съобрази с това.
Re: Виртуален деструктор
Хм, аз си мислех, че поведението е като на всяка невиртуална функция - вика се базовото и не се вика наследеното.
Редактирано от Pekoнcтpykтop на
Re: Виртуален деструктор
Ми понеже С++ е за мислещи хора, не е като Java-та, която внимава вместо програмиста и трие всичко в някой бъдещ момент.
Виртуалният деструктор ти товари класа с виртуална таблица, която си е излишен товар, ако няма други виртуални методи и няма наследяване. Наличието на какви и да е виртуални методи без наследяване си е товарене.
Виртуалният деструктор ти товари класа с виртуална таблица, която си е излишен товар, ако няма други виртуални методи и няма наследяване. Наличието на какви и да е виртуални методи без наследяване си е товарене.
Re: Виртуален деструктор
Така е, ама не е ясно какво става с членовете на наследниците (няма да се унищожат и могат да доведат до други грижи), затова е неопределено.
Re: Виртуален деструктор
В този смисъл - да.
C++ отдавна му е време за ъпгрейд - примерно съм си мислел за няква директива в хедъра, която автоматично инструктира компилатора да прави всички методи виртуални по подразбиране.
Re: Виртуален деструктор
Има смисъл само ако въпросният клас се наследява. Иначе - не. Но дори и да се наследява, пак можеш да искаш да си играеш с предефинирането на методите, та би било насилствено ограничение (като в джава).
Re: Виртуален деструктор
Е няма нужда да ти обяснявам, че във всички модерни езици всичко е виртуално по подразбиране. Та дори и в другия ОО клон на тоз език - обджектив си-то. Просто това е прямата логика - като напишеш нещо повторно е ясно, че искаш да се ползва то, а не предишното. Естествено, трябва да си остава вратичка за пърформанс, това е Ц, все пак. :) Сега като се замисля, по-скоро трябва да се инвертира декларацията, тоест вместо virtual да има nonvirtual.
Re: Виртуален деструктор
В тия модерни езици виртуалността е по подразбиране по същата причина като безпаметността на Джавата - много глупаци се насочиха към програмирането и трябва да им се улесни животът. По-лошият пърформанс се компенсира с по-скоростната техника, ма пак си остава по-лош спрямо нещо написано на С/С++.
Аналогия: кола със скоростна кутия и модерна кола с автоматични скорости.
Аналогия: кола със скоростна кутия и модерна кола с автоматични скорости.
Re: Виртуален деструктор
ами защото компилатора като обработва декларациите не знае дали тая ситуация ще се случи или не, в смисъл програмиста може никъде да не трие обекти през базов клас, така че да не му трябва виртуален деструктор. това впрочем е по-често срещаната ситуация.
а резултата е неопределен по стандарт може би, но реално си е съвсем определен - просто не се вика деструктора на наследниците.
NE SUTOR ULTRA CREPIDAM
а резултата е неопределен по стандарт може би, но реално си е съвсем определен - просто не се вика деструктора на наследниците.
NE SUTOR ULTRA CREPIDAM
Re: Виртуален деструктор
Едно от малоумията на C++ -- създателя на базов клас определя дали и как можеш да използваш и наследените класове.
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Виртуален деструктор
push param1;
push param2;
///////////////////
mov ecx, pSA;
mov edx, [ecx];//first 4 bytes are the pointer to the vtable
//////////////////
call [edx];//call first element from the vtable (offset 0)
goljam overhead - nema shto ;-)
push param2;
///////////////////
mov ecx, pSA;
mov edx, [ecx];//first 4 bytes are the pointer to the vtable
//////////////////
call [edx];//call first element from the vtable (offset 0)
goljam overhead - nema shto ;-)
Re: Виртуален деструктор
Недей разсъждава като джаваджия - паметта не е безкрайна. Тук 4 байта, там 4 байта и в един момент ще останеш с 0 свободни байтове. По твоята логика и защо въобще да викаме delete? Да си купи потребителя още памет и нема да има грижи с твоите програми ...
Re: Виртуален деструктор
Размерът на паметта ли е проблема на с овърхеда при викане на виртуални функции? Хехехе.
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Редактирано от | на
Re: Виртуален деструктор
Q: По твоята логика и защо въобще да викаме delete ?
---------------------------------------------------------------
A: Ami ne trqbva da se vika delete...pravi ti heap-a na salata , osobeno ako go pravish chesto za mnogo i malki obekti s razlichen razmer. ( pooling e dalech po - dobyr variant )
inache ako pishesh software za peralni si prav C/Assembler rulz
---------------------------------------------------------------
A: Ami ne trqbva da se vika delete...pravi ti heap-a na salata , osobeno ako go pravish chesto za mnogo i malki obekti s razlichen razmer. ( pooling e dalech po - dobyr variant )
inache ako pishesh software za peralni si prav C/Assembler rulz
Re: Пий си хапчетата
И да ги пия, няма да станеш по-грамотен. "Тук 4 байта, там 4 байта и в един момент ще останеш с 0 свободни байтове. " -- невероятно :)
The last good thing written in C was Franz Schubert's Symphony No. 9.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Виртуален деструктор
Май не си чувал за собствен memory management? Българският се пише на кирилица, и това не си чувал, нали?
Re: Виртуален деструктор
Овърхеда наистина е голям, но това не прави използването на виртуални функции лошо нещо.
Забавното е, че повечето идиоти които квичат за овърхед дори не знаят какъв точно е овърхеда :)
The last good thing written in C was Franz Schubert's Symphony No. 9.
Забавното е, че повечето идиоти които квичат за овърхед дори не знаят какъв точно е овърхеда :)
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Виртуален деструктор
Май не си чувал за собствен memory management?
dobre che si ti da me svetnesh ;-)
Българският се пише на кирилица
ne si ti choveka koito she mi kazva kak da pisha.
p.s priemash temata tvyrde lichno, njamam za cel da se zajazdam a da ti objasnja kak call na virtualna funkcja se compilira do assembler.
aide sys zdrave
dobre che si ti da me svetnesh ;-)
Българският се пише на кирилица
ne si ti choveka koito she mi kazva kak da pisha.
p.s priemash temata tvyrde lichno, njamam za cel da se zajazdam a da ti objasnja kak call na virtualna funkcja se compilira do assembler.
aide sys zdrave