Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
1

Отличие приведение типов указателей

29.02.2016, 17:28. Показов 1066. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Чем отличаются при Base* a_ptr = new Derivered(); следующие строки:
  • A) auto ptr = static_cast<Derived*>( a_ptr );
  • B) auto ptr = dynamic_cast<Derived*>( a_ptr );

Мои предположения:
1) если в A тип a_ptr не находится в иерархии с Derivered - UB
2) если Base в B не имеет VTABLE ошибка компиляции
3) если в В оба виртуальных типа, но Base и Derivered не в одной ветке иерархии - вернёт nullptr, когда UB

Что я пропустил?

C++
1
2
3
4
5
6
class Base
{
};
class Derived : public Base
{
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.02.2016, 17:28
Ответы с готовыми решениями:

приведение типов указателей
Задача у меня простая. Нужно побитно оперировать с числом unsigned int и на каких-то этапах...

Приведение типов умных указателей
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename...

Различия указателей char* от указателей других типов
Помогите пожалуйста разобраться! Прочитал раздел про указатели и даже вроде бы понял. Что...

Приведение указателей
В функции в качестве параметра передаю указатель на один из самых базовых классов . Затем в функции...

8
125 / 117 / 67
Регистрация: 07.11.2014
Сообщений: 788
29.02.2016, 18:55 2
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Base* a_ptr = new Derivered();
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
A) auto ptr = static_cast<Derived*>( a_ptr );
Так Derived или Derivered? Или обе?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.02.2016, 19:18 3
Цитата Сообщение от Aymurat Посмотреть сообщение
Так Derived или Derivered? Или обе?
нет.
только Derived, я думаю.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
29.02.2016, 21:33  [ТС] 4
Да там опечатка. new Derived
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
01.03.2016, 00:05 5
static_cast - это наиболее безопасный компайл тайм каст -> у него ub быть не может. А будут ошибки компиляции.
Посыпаю голову пеплом, конечно может быть ub.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) если в A тип a_ptr не находится в иерархии с Derivered - UB
Вот в этом случае будет не ub а ошибка компиляции.
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
01.03.2016, 09:18 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вернёт nullptr, когда UB
если что-то в определенной ситуации возвращает nullptr - это уже не UB, а вполне себе defined.
Все UB описаны в стандарте, зачем их додумывать?
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
01.03.2016, 11:13  [ТС] 7
Kastaneda, там вырезалась фраза - когда у конкурента UB


Nosey, так вы чтоли рекомендуете использовать статик_каст в местах, где надо динамик_каст?
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
01.03.2016, 12:49 8

Не по теме:

Удалите меня с форума :rofl:, а-то пишу всякую недодуманую чушь:-[


Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Nosey, так вы чтоли рекомендуете использовать статик_каст в местах, где надо динамик_каст?
Это идеальная рекомендация, но недостижимая - избавляться от динамик каста.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) если в A тип a_ptr не находится в иерархии с Derivered - UB
Если не находится в иерархии подразумевает статическое не нахождение в иерархии, то компилятор выдаст ошибку компиляции.
Если же в рантайме окажется, что a_ptr не дорос до Derived - будет ub.
0
rikimaru2013
01.03.2016, 13:53  [ТС]     Отличие приведение типов указателей
  #9

Не по теме:

Nosey, Nosey, всё для тебя !

C++
1
2
3
4
5
6
7
8
 std::string user = "Nosey";
     auto seach = std::find_if(std::begin(m_users), std::end(m_users), [=](const User& curr){
                  return User.getName() == user;
     });
     if(seach != std::end(m_users))
     {
         m_users.erase(seach);
     }

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2016, 13:53

Приведение указателей
Вопрос немного из другого раздела, но тем не менее, вопросы не по поводу WinApi, а поводу...

Отличие инкриментов указателей
Чем отличатеся ++*p от (*p)++ и от *p++ вроде увеличивается значение а не адлрес...

Приведение указателей в стиле си
Здравствуйте, это наверное самый дурацкий вопрос но что значит скобочки в c++ т.е вот например дан...

Неявное приведение указателей на классы
Всем привет! Обнаружилась вот такая нестыковочка: имеем интерфейсный класс IIn. И имеем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru