Предполагается, что подобъект базового класса Base
находится в начале Derived
. Это не сработает, если вы добавите еще один базовый класс.
Кроме того, ваш код неверен: арифметика указателей выполняется в терминах объектов, а не в байтах. Вам нужно использовать reinterpret_cast<char*>(this)
для выполнения арифметики в байтах. В любом случае, вы все равно не должны этого делать.
Рассмотрим следующий, не уродливый, соответствующий стандартам подход, использующий инициализацию значения:
struct Derived : public Base
{
struct DerivedMembers { /* ... */ }
DerivedMembers data;
Derived() : data() { }
};
Пока DerivedMembers
не имеет конструктора, это будет инициализировать значение каждого из элементов данных data
, что выглядит так, как вы хотите.
Или, если вы хотите, чтобы члены были доступны без использования переменной-члена "data
", рассмотрите возможность использования другого базового класса:
struct DerivedMembers { /* ... */ }
struct Derived : Base, DerivedMembers
{
Derived() : DerivedMembers() { }
};