Войти
ПрограммированиеФорумОбщее

C++ Как статически проверить что базовый тип - первый? (3 стр)

Страницы: 1 2 3
#30
16:45, 11 авг. 2017

gamedeveloper01

Мало того. Можно даже оператор new перегpузить.
А вообще не даже, а скорее всего такие перегрузки нужны в паре, чтоб все работало со своим мемори мэнеджером...
Но это никак, опять таки, не касается твоей темы. Вызовутся все деструкторы, так как они виртуальные.


#31
22:54, 11 авг. 2017

gamedeveloper01
> Хотя тут 99% даже не знает что delete можно перегружать и для чего это вообще
> надо, да я и сам только сейчас с этим столкнулся.

Да все кто на си пи что-то там печатал знают об этом. Но тонкостей там много

#32
23:03, 11 авг. 2017

dave
> Вызовутся все деструкторы, так как они виртуальные.

Не потому что они виртуальные.

#33
5:50, 12 авг. 2017

ZeroCool++
> Не потому что они виртуальные.

Как раз таки поэтому.
Удаление по указателю на базовый тип без виртуалъных деструкторов приведет к мемориликам.

#34
10:18, 12 авг. 2017

dave
> Удаление по указателю на базовый тип без виртуалъных деструкторов приведет к
> мемориликам

Это нужно что бы вызвался переопределенный деструктор в потомке, который в свою очередь неявно вызовет деструктор базового класса, а тот своего базового.

dave
> Вызовутся все деструкторы, так как они виртуальные.

И ничего подобного, не очень хорошо знаешь си пи пи.

При множественном наследовании, если хорошо понимаешь полиморфизм в си пи пи и как обычно он там реализуются, через виртуальные таблицы, то ты должен осознавать, что деструкторы второго и последующих базовых классов не должны вызваться, т.е. с точки зрения семантики языка си пи пи деструкторы не должны работать. Но они как ты заметил вызываются, и это не потому что они виртуальные (можешь поудалять слово virtual деструкторы все равно вызовутся у всех базовых классов, единственное только не будут вызваны деструкторы потомков, ну потому что они не переопределены). Компилятор для вызова всех деструкторов генерирует особый код и к виртуальным методам он не имеет никакого отношения, компилятору известны адреса всех деструкторов (и не важно есть они в виртуальной таблице или нет), ему не составляет сложности дернуть все нужные деструкторы.

Вот кусок кода, который хорошо показывает, что виртуальность там, ну не причем:

http://ideone.com/3kh7tg

Обрати внимание, деструкторы были вызваны все, но не все были виртуальными.

Но были все виртуальные методы F(). И метод F() вызвался один раз. Для одного базового класса, а не для всех как в случае с деструктором, потому что виртуалные функции нужны не для

dave
> Вызовутся все деструкторы, так как они виртуальные.

#35
10:46, 12 авг. 2017

ZeroCool++

У меня впечатление что ты сам не понимаешь о чем идет речь.
Ни того, что я писал в последнем сообщении, ни того о чем писал ТС в первом.
В твоем коде виртуальные деструкторы и не нужны.
Ты создаешь обьект потомка и вызываешь его деструктор при выходе из main. Естественно он сам прекрасно знает о своих предках и вызывает все их деструкторы.
Речь идет об удалении потомка через указатель на eго родительский класс, причем даже с множественным наследованием, это беспокоило ТС и тут нужны виртуальные деструкторы и именно для этого они сделаны.

> И ничего подобного, не очень хорошо знаешь си пи пи.
Угу. Рад что ты знаешь хорошо.

#36
11:03, 12 авг. 2017

И да, деструкторы по умолчанию noexcept. Это лишнее...

Страницы: 1 2 3
ПрограммированиеФорумОбщее

Тема в архиве.