S>Насколько нижеприведённый код корректен. Всегда ли все данные базавого класса находятся перед данными, объявленными в наследнике.
Необязательно.
А что такого в твоем примере? Ты мог бы обойтись и без преобразования. Вот если б ты указатель на B * сначала к void * привел, а потом к А — ты такое имел в виду?
Of course, the code must be complete enough to compile and link.
Абсолютно корректный код. Собственно в этом и есть суть открытого наследования. Более того, тебе не требуются явные преобразования:
class A
{
...
};
class B : public A
{
public:
int i;
void* ptr;
};
int func(A *a);
int reffunc(A& );
int main()
{
B b;
func(&b);
reffunc(b);}
S>...Всегда ли все данные базавого класса находятся перед данными, объявленными в наследнике.
Тебя это не должно волновать. Код корректный по определению.
Здравствуйте, sercher, Вы писали:
S> A *a = (A*)&b;
В данном случае будет не reinterpret, а static cast. Следовательно, всё зашибись.
Однако потенциально такой код опасен: вдруг ты разорвёшь связь между классами A и B? Тогда автоматически здесь будет реинтерпрет со всеми его последствиями, а компилятор разве что вонинг выдаст.