Upcasting и Downcasting пропускают иерархию в С++?

Я искал этот конкретный вопрос, но не смог его найти, так что вот он. Можно ли повышать или понижать уровень, пропуская классы в середине?

Пример кода-

class Base { }
class Derived : public Base { }
class DerivedOfDerived : public Derived { }
class DerivedOfDOD : public DerivedOfDerived { }

int main()
{
    DerivedOfDOD *dodod = new DerivedOfDOD();
    Base *b = static_cast<Base *>(dodod);
    Derived *d = static_cast<Derived *>(b);
    back_to_b = static_cast<Base *>(d);
    DerivedOfDerived *dod = static_cast<DerivedOfDerived *>(back_to_b);
    delete dodod;
}

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

b не является DerivedOfDOD/Derived, поэтому любое использование dodod, d будет считаться UB.
Jarod42 29.01.2019 15:26

@ Jarod42, спасибо за это, я обновил код так, как я действительно имел в виду.

SagunKho 29.01.2019 15:30

Теперь ваш код действителен.

Jarod42 29.01.2019 15:32

Конечно, это действительно.

Matthieu Brucher 29.01.2019 15:32

Но у тебя утечка памяти. и так как ваши классы не виртуальные, вы должны удалить его с dodod.

Jarod42 29.01.2019 15:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Is it fine to upcast or downcast by skipping the classes in the middle?

да.

Is this valid code?

да. (Если игнорировать утечку памяти)

P.S. Восходящее преобразование является неявным, поэтому Base *b = dodod; достаточно.

Утечка памяти только делает код подозрительным, но не делает его недействительным.

j6t 29.01.2019 15:54

@j6t зависит от того, что вы подразумеваете под «действительным» и от контекста утечки памяти.

eerorika 29.01.2019 15:56

Под «действительным» я подразумеваю, что Стандарт не требует освобождения памяти или уничтожения объектов (иначе программа демонстрирует неопределенное поведение).

j6t 29.01.2019 15:59

Другие вопросы по теме