Я искал этот конкретный вопрос, но не смог его найти, так что вот он. Можно ли повышать или понижать уровень, пропуская классы в середине?
Пример кода-
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;
}
Это действительный код? И объяснение того, как компилятор управляет адресами и такого рода приведением, было бы очень признательно.
@ Jarod42, спасибо за это, я обновил код так, как я действительно имел в виду.
Теперь ваш код действителен.
Конечно, это действительно.
Но у тебя утечка памяти. и так как ваши классы не виртуальные, вы должны удалить его с dodod.





Is it fine to upcast or downcast by skipping the classes in the middle?
да.
Is this valid code?
да. (Если игнорировать утечку памяти)
P.S. Восходящее преобразование является неявным, поэтому Base *b = dodod; достаточно.
Утечка памяти только делает код подозрительным, но не делает его недействительным.
@j6t зависит от того, что вы подразумеваете под «действительным» и от контекста утечки памяти.
Под «действительным» я подразумеваю, что Стандарт не требует освобождения памяти или уничтожения объектов (иначе программа демонстрирует неопределенное поведение).
bне являетсяDerivedOfDOD/Derived, поэтому любое использованиеdodod,dбудет считаться UB.