0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 36
|
|||||||||||
1 | |||||||||||
Наследование - вызов конструкторов и деструкторов01.11.2015, 02:04. Показов 4425. Ответов 53
Метки нет (Все метки)
Делаю два класса - предок и потомок:
Подскажите пожалуйста, почему во втором случае не вызвался деструктор класса-наследника??
0
|
01.11.2015, 02:04 | |
Ответы с готовыми решениями:
53
Вызов конструкторов/деструкторов при наследовании Вызов лишних конструкторов и деструкторов в std::vector Задание с использованием конструкторов и деструкторов Порядок вызова конструкторов/деструкторов |
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
07.11.2015, 14:10 | 41 |
вы ж не от сферического вакуума наследуетесь.
кто-то разработал базовый класс, заложив основу - дизайн. и, например, он определил ряд виртуальных функций-членов специально предназначенных для определения в наследниках. зачем это было нужно зависит от конкретной ситуации. это - с++. здесь полным полно подобных нюансов. хорошая новость в том, что на практике подобного рода грабельки жить не мешают. ну вот я например, втыкаю только в прототипы. детали реализации чужого класса меня не интересуют (настолько, насколько это вообще возможно в несовершенном мире). с другой стороны, я не дергаю функционал базы в конструкторе своего наследника. обычно в этом просто нет необходимости.
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
07.11.2015, 14:38 | 42 |
hoggy
Дело в том, что если нужно манипулировать именно поведением, то наследование избыточный механизм, потому что ещё и навешивает типовую метку. Если же NVI подразумевает создание подтипа, то неизбежно расширенный класс столкнётся с тем, что нужно детально знать базовый контракт, иначе легко провалить аксиоматику подтипа. В итоге: NVI не спасает от проблем наследования, но работа с открытыми виртуальными методами всегда более прозрачная.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
07.11.2015, 16:44 | 43 | |||||
особенность механизма наследования:
он практичен, что значит прост в эксплуатации а его киллер фича - статика. компилятор обладает всей полнотой информации о типах, участвующих в иерархии наследования, что позволяет ему генерировать более эффективный код. например вот этот код:
ответ: потому что никаких виртуальных вызовов и не было. компилятор сумел оптимизировать виртуальный вызов до прямого. скажем так... с классическим паттерном "стратегия" у компиляторов все намного печальнее. можно ещё применить статическую стратегию на шаблонах. пожалуй это будет эффективно. но это уже тяжелая артиллерия. шаблоно-магия не всегда приемлема. а он и не предназначен для этой цели. NVI - это тупо "фабричный метод". наследники реализуют лишь мелкие не сильно значащие детальки. а основняк крутится в базе, и лишь время от времени тыркает наследников "уточнить мелочовку". и потом, что такое вообще "проблемы наследования" ? если речь идет о том, что приходится вникать в детали базовых классов, то это проблема их дизайна, а вовсе не наследования, как такового. можно же сделать так, что и не придется. это зависит от конкретных ситуаций, и конкретных классов.
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
07.11.2015, 17:27 | 44 |
А под Debian собранный с использованием gcc и Windows10 vs 2015 получается Segmentaion Fault в релизе. В дебаге vs 2015 даёт pure virtual function call.
Если речь только "о детальках реализации", то почему не стратегии Александреску? Открытое наследование ещё и прицепит новый тип, по существу создаст новый контракт.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
07.11.2015, 17:58 | 45 |
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
07.11.2015, 18:10 | 46 |
Возможно.
Но и Вы на вопрос не ответили. Ваш код под стратегии Александреску можно и без шаблонов переделать. Почему не стратегии?
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
07.11.2015, 18:19 | 47 |
а зачем?
в отдельных ситуациях они - то, что доктор прописал. но они более сложны в плане понимания и эксплуатации. к тому же, они никак не избавят вас от ваших проблем с наследованием. просто раньше вам приходилось втыкать в базовый класс. а теперь - в класс стратегии. те же яйца, только сбоку.
0
|
306 / 101 / 18
Регистрация: 04.07.2014
Сообщений: 571
|
|
07.11.2015, 18:30 | 48 |
Со стратегиями мне уже действительно не приходится задумываться о "базовом классе", просто потому что у меня нет "базового класса". NVI подразумевает наследование и основного интерфейса, и интерфейса деталей реализации. То есть NVI вдвое сложнее.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
07.11.2015, 18:35 | 49 |
не факт.
NVI подразумевает, что вам нужно вдуплять только в мелкие частности, которые определяет наследник. что такое "интерфейс деталей реализации" мне не понятно. однако сама фраза содержит внутреннее противоречие. следует отделять понятие интерфейса от деталей реализации, которые он инкапсулирует.
0
|
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 36
|
||||||
09.11.2015, 10:22 [ТС] | 50 | |||||
Тогда так:
0
|
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 36
|
||||||
09.11.2015, 12:38 [ТС] | 52 | |||||
тузик, расскажи нам про свое понимание, например, этого:
Но, кажется, я и без экспертов понял в чем дело...
0
|
0 / 0 / 0
Регистрация: 06.07.2015
Сообщений: 36
|
|
09.11.2015, 19:07 [ТС] | 54 |
0
|
09.11.2015, 19:07 | |
09.11.2015, 19:07 | |
Помогаю со студенческими работами здесь
54
Правильное использование конструкторов и деструкторов Разработка классов, создание конструкторов и деструкторов Ошибки в программе с использованием конструкторов/деструкторов Как реализовать набор конструкторов и деструкторов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |