Гарантии на адресе базового класса в C++?

В структуре C мне гарантируют это:

struct Foo { ... };
struct Bar {
  Foo foo;
  ...
}
Bar bar;
assert(&bar == &(bar.foo));

Теперь, в C++, если я имею:

class Foo { ... };
class Bar: public Foo, public Other crap ... {
  ...
}

Bar bar;
assert(&bar == (Foo*) (&bar)); // is this guaranteed?

Если так, можно ли дать мне ссылку (как "Язык Программирования на C++, страница xyz")?

Спасибо!

8
задан Matt 3 July 2013 в 16:50
поделиться

3 ответа

Нет гарантии. Из стандарта C ++ 03 (10/3, классные. Индерные):

Порядок, в котором выделяется порядок базового класса (1.8), не указано в наиболее производном объекте (1.8).

10
ответ дан 5 December 2019 в 10:02
поделиться

Несмотря на то, что расположение для базовых классов не гарантируется Как, кажется, вы думаете (и даже если есть больше гарантий для членов), это гарантируется:

Bar bar;
assert(&bar == (Foo*) (&bar));

Поскольку ztace использует Static_Cast (за 5,4), который будет преобразовать и PAR правильно, и сравнение между указателем-базой и указателем-полученным путем преобразована аналогично.

Это, однако, не будет гарантировано:

Bar bar;
void* p1 = &bar;
void* p2 = (Foo*)&bar;
assert(p1 == p2); // not guaranteed
6
ответ дан 5 December 2019 в 10:02
поделиться

Я не представляю, что это будет, я не знаю, почему это должно быть.

У меня связанный вопрос.

Если у вас есть алмазное наследование:

class Base(){ virtual void AFunc(){}  };

class A:Base{};
class B:Base{void AFunc(){} }

class Test:A,B{};


Base * b = (Base*)new Test;

b->AFunc();

позволяет предположить, что структура памяти является основой: A: B: Test,

Примечание в точке вызова, все компиляторы знают, что является адресом начала объекта, И afunc ожидает быть относительным к началу объекта B, эти два адреса не будут одинаковыми! Итак, как это работает?

Вроде бы, если B имел тип B, два адреса будут одинаковыми ...

1
ответ дан 5 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: