Доступ к приватным полям через арифметику указателей?
Можете, пожалуйста, объяснить как точно все это устроено в памяти?
Обычно это устроено так, что поля идут одно за другим в памяти. Но кроме размера у полей есть выравнивание. Например, uint32_t выравнивается на 4 байта, а uint64_t -- на 8. Поэтому между идущими подряд полями разного типа могут быть дырки.
В приведённом примере double -- поле с наибольшим выравниванием, выравнивание объекта будет на 8, поле c будет по смещению 0 в объекте, поле d -- по смещению 8, а поле i -- по смещению 16. Если иметь это в виду, то игры с указателями приобретают смысл.

Текст задания: все поля этого класса закрытые, ваша задача реализовать несколько функций, которые дают полный доступ к этим полям (см. шаблон кода), несмотря на то, что они закрытые.
Пожалуйста, никогда так не делай.
если нет виртуальных методов, то можно считать что данные идут подряд. по сути тебе нужно правильно обратиться к нужному участку памяти. Почитай про выравнивание в памяти.