Russian Qt Forum
Ноябрь 23, 2024, 11:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Срезка или нет  (Прочитано 5839 раз)
Disa
Гость
« : Февраль 19, 2013, 21:53 »

Добрый вечер.

Восполняю свои пробелы по полиморфизму Улыбающийся

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

Вопрос, если я использую addChildren, не перегружая его а потом от этого children'а, parent() - будет происходить срезка или нет? Ну то есть он мне вернет именно мой класс с моими данными?

Спасибо.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Февраль 19, 2013, 22:53 »

В run-time вернет, но в compile-time вы до него не дотянетесь, без преобразования типов. Сделайте наследника от QObject и посмотрите, как это бывает. Вся функциональность по детям-родителям в нем уже есть.
Записан

Пока сам не сделаешь...
Disa
Гость
« Ответ #2 : Февраль 19, 2013, 22:58 »

Цитировать
В run-time вернет, но в compile-time вы до него не дотянетесь, без преобразования типов

Ну это-то как раз не проблема, за правильностью типов я проследить могу, мне главное чтобы поля не пропали Улыбающийся Ну ладно, видимо придется завтра тестовые классы писать.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #3 : Февраль 19, 2013, 23:14 »

Такая штука, как "c++ virtual covariant", может пригодиться в подобных случаях.
Записан

Пока сам не сделаешь...
Disa
Гость
« Ответ #4 : Февраль 20, 2013, 01:13 »

Спасибо, почитаю.

PS: С института слово ковариантный заставляет меня думать об МСС, Теории пластичности и тензорах. Ровно так же, как и энтропия в машинлернинге Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Февраль 21, 2013, 09:57 »

>>будет происходить срезка или нет?
А что это за термин такой - "Срезка"?
Записан

Юра.
Disa
Гость
« Ответ #6 : Февраль 21, 2013, 13:10 »

Термин встречал во 2ом издании у Страуструпа. Иногда называется еще "расщепление".

C RSDN'а:
Цитировать
Коротко — в производном классе могут быть определены дополнительные поля. Во время присваивания при преобразовании по принципу подстановки "лишние поля в объект базового класса. естественно, не попадают.

Чтобы понять, в чем дело, обратимся к классам точек. Рассмотрим простой пример с двумерными и трехмерными точками.
Point3D b(1,2,3);
Point2D a = b;            // подстановка в конструкторе копирования - срезка
a = b;                    // подстановка в присваивании - срезка

Работает принцип подстановки, однако нас поджидает неприятность: так как базовый класс ничего не знает о своих наследниках, то в переменную a копируется только Point2D-часть трехмерной точки. Этот эффект называется срезкой [Страуструп] или расщеплением [Брюс Эккель]; он частенько приводит к ошибкам. Например, при передаче параметра по значению, как мы знаем, работает конструктор копирования, поэтому в таких случаях тоже может произойти срезка.

Ну вот собственно я уже нашел ответ на свой вопрос, что при передачи по ссылке или указателю срезки не бывает. 
« Последнее редактирование: Февраль 21, 2013, 13:13 от Disa » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 21, 2013, 13:26 »

Ну вот собственно я уже нашел ответ на свой вопрос, что при передачи по ссылке или указателю срезки не бывает. 
А без всякого чтения это было не так уж очевидно?  Улыбающийся
Записан
Disa
Гость
« Ответ #8 : Февраль 21, 2013, 13:32 »

Ну мне в Си++ часто многие вещи не очевидны, я помню когда начинал программировать только меня жутко удивляло (это мало сказано), что побитовый сдвиг выводит сообщение на экран, а итераторы работаю в циклах быстрее когда ++ префиксный.  
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.088 секунд. Запросов: 22.