Виртуален деструктор

75 отговора 0 прегледа
#1

Виртуален деструктор

С++. По стандарт, ако се опитаме да изтрием обект от наследен клас чрез указател към базов клас, при положение че деструкторът на базовия клас НЕ е виртуален, резултатът е НЕОПРЕДЕЛЕН. Защо неопределен, питам аз? И защо в такъв случай не са забранили на базовите класове да имат невиртуални деструктори? От съображения за ефективност ли само? Имаш дефицит на памет, правиш невиртуален деструктор на някакъв клас, за да пестиш ... И после го наследяваш и внимаваш, не че е невъзможно да възникнат такива ситуации, ама пък въпрос на дизайн, ако забранят базовите класове да имат невиртуални деструктори, дизайнът ще се съобрази с това.

Отговор
в отговор на Om_ #2

Re: Виртуален деструктор

Хм, аз си мислех, че поведението е като на всяка невиртуална функция - вика се базовото и не се вика наследеното.

Редактирано от Pekoнcтpykтop на

Отговор
в отговор на Om_ #3

Re: Виртуален деструктор

Ми понеже С++ е за мислещи хора, не е като Java-та, която внимава вместо програмиста и трие всичко в някой бъдещ момент.

Виртуалният деструктор ти товари класа с виртуална таблица, която си е излишен товар, ако няма други виртуални методи и няма наследяване. Наличието на какви и да е виртуални методи без наследяване си е товарене.

Отговор
в отговор на Pekoнcтpykтop #4

Re: Виртуален деструктор

Така е, ама не е ясно какво става с членовете на наследниците (няма да се унищожат и могат да доведат до други грижи), затова е неопределено.

Отговор
в отговор на Пaниkoвckи #5

Re: Виртуален деструктор

В този смисъл - да. C++ отдавна му е време за ъпгрейд - примерно съм си мислел за няква директива в хедъра, която автоматично инструктира компилатора да прави всички методи виртуални по подразбиране.

Отговор
в отговор на Pekoнcтpykтop #6

Re: Виртуален деструктор

Има смисъл само ако въпросният клас се наследява. Иначе - не. Но дори и да се наследява, пак можеш да искаш да си играеш с предефинирането на методите, та би било насилствено ограничение (като в джава).

Отговор
в отговор на Pekoнcтpykтop #7

Re: Виртуален деструктор

баце те ъпдейт му направиха преди няколко месеца :)

Отговор
в отговор на Пaниkoвckи #8

Re: Виртуален деструктор

Е няма нужда да ти обяснявам, че във всички модерни езици всичко е виртуално по подразбиране. Та дори и в другия ОО клон на тоз език - обджектив си-то. Просто това е прямата логика - като напишеш нещо повторно е ясно, че искаш да се ползва то, а не предишното. Естествено, трябва да си остава вратичка за пърформанс, това е Ц, все пак. :) Сега като се замисля, по-скоро трябва да се инвертира декларацията, тоест вместо virtual да има nonvirtual.

Отговор
в отговор на Pekoнcтpykтop #9

Re: Виртуален деструктор

В тия модерни езици виртуалността е по подразбиране по същата причина като безпаметността на Джавата - много глупаци се насочиха към програмирането и трябва да им се улесни животът. По-лошият пърформанс се компенсира с по-скоростната техника, ма пак си остава по-лош спрямо нещо написано на С/С++.

Аналогия: кола със скоростна кутия и модерна кола с автоматични скорости.

Отговор
в отговор на Om_ #10

Re: Виртуален деструктор

ами защото компилатора като обработва декларациите не знае дали тая ситуация ще се случи или не, в смисъл програмиста може никъде да не трие обекти през базов клас, така че да не му трябва виртуален деструктор. това впрочем е по-често срещаната ситуация.
а резултата е неопределен по стандарт може би, но реално си е съвсем определен - просто не се вика деструктора на наследниците.




NE SUTOR ULTRA CREPIDAM
Отговор
в отговор на Om_ #11

Re: Виртуален деструктор

Едно от малоумията на C++ -- създателя на базов клас определя дали и как можеш да използваш и наследените класове.

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на Пaниkoвckи #12

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 ;-)

Отговор
в отговор на rossen genchev #13

Re: Виртуален деструктор

Недей разсъждава като джаваджия - паметта не е безкрайна. Тук 4 байта, там 4 байта и в един момент ще останеш с 0 свободни байтове. По твоята логика и защо въобще да викаме delete? Да си купи потребителя още памет и нема да има грижи с твоите програми ...

Отговор
в отговор на Пaниkoвckи #14

Re: Виртуален деструктор

Размерът на паметта ли е проблема на с овърхеда при викане на виртуални функции? Хехехе.

The last good thing written in C was Franz Schubert's Symphony No. 9.

Редактирано от | на

Отговор
в отговор на | #15

Пий си хапчетата

Глобявам се с 10 лв.

Отговор
в отговор на Пaниkoвckи #16

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ниkoвckи #17

Re: Пий си хапчетата

И да ги пия, няма да станеш по-грамотен. "Тук 4 байта, там 4 байта и в един момент ще останеш с 0 свободни байтове. " -- невероятно :)

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на rossen genchev #18

Re: Виртуален деструктор

Май не си чувал за собствен memory management? Българският се пише на кирилица, и това не си чувал, нали?

Отговор
в отговор на rossen genchev #19

Re: Виртуален деструктор

Овърхеда наистина е голям, но това не прави използването на виртуални функции лошо нещо.

Забавното е, че повечето идиоти които квичат за овърхед дори не знаят какъв точно е овърхеда :)

The last good thing written in C was Franz Schubert's Symphony No. 9.
Отговор
в отговор на Пaниkoвckи #20

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

Отговор