Преобразование объектов
От: sercher Украина  
Дата: 04.02.04 10:54
Оценка:
Насколько нижеприведённый код корректен. Всегда ли все данные базавого класса находятся перед данными, объявленными в наследнике.


 class A
 {
   ...   
 };

 class B : public A
 {
   public:
    int i;
    void* ptr;
 };

 int func(A *a);

 int main()
 {
    B b;
    A *a = (A*)&b;
    func(a); 
 }
Re: Преобразование объектов
От: Lorenzo_LAMAS  
Дата: 04.02.04 10:57
Оценка:
S>Насколько нижеприведённый код корректен. Всегда ли все данные базавого класса находятся перед данными, объявленными в наследнике.

Необязательно.

А что такого в твоем примере? Ты мог бы обойтись и без преобразования. Вот если б ты указатель на B * сначала к void * привел, а потом к А — ты такое имел в виду?
Of course, the code must be complete enough to compile and link.
Re: Преобразование объектов
От: jazzer Россия Skype: enerjazzer
Дата: 04.02.04 11:01
Оценка:
Здравствуйте, sercher, Вы писали:


S>Насколько нижеприведённый код корректен.


абсолютно корректен, явное преобразование не требуется.

S>Всегда ли все данные базавого класса находятся перед данными, объявленными в наследнике.


нет, но в приведенном примере это неважно, если, конечно, ты не занимаешься хакерством внутри func — но тогда это уже будет другой вопрос.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Преобразование объектов
От: Vamp Россия  
Дата: 04.02.04 11:11
Оценка:
Абсолютно корректный код. Собственно в этом и есть суть открытого наследования. Более того, тебе не требуются явные преобразования:


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>...Всегда ли все данные базавого класса находятся перед данными, объявленными в наследнике.

Тебя это не должно волновать. Код корректный по определению.
Да здравствует мыло душистое и веревка пушистая.
Re: Преобразование объектов
От: Кодт Россия  
Дата: 05.02.04 18:29
Оценка:
Здравствуйте, sercher, Вы писали:

S> A *a = (A*)&b;


В данном случае будет не reinterpret, а static cast. Следовательно, всё зашибись.
Однако потенциально такой код опасен: вдруг ты разорвёшь связь между классами A и B? Тогда автоматически здесь будет реинтерпрет со всеми его последствиями, а компилятор разве что вонинг выдаст.
Перекуём баги на фичи!
Re[2]: Преобразование объектов
От: Vamp Россия  
Дата: 06.02.04 07:53
Оценка:
К>...а компилятор разве что вонинг выдаст.
Да не выдаст он.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.