Про ++

Тема в разделе "WASM.BEGINNERS", создана пользователем green5, 22 янв 2007.

  1. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    #include <stdio.h>

    struct a_t
    {
    virtual void vproc() { printf("a_t\n"); }
    void print() { vproc(); }
    } aa;

    a_t &a0=aa,*a1=&aa;

    struct b_t : a_t
    {
    virtual void vproc() { printf("b_t\n"); }
    } bb;

    int main()
    {
    a0=bb;
    a1=&bb;
    a0.print(); // -> a_t - это нормально?
    a1->print(); // -> b_t
    return 0;
    }
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    не знаю, но вообще логично
     
  3. TheRawGod

    TheRawGod New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    71
    Нормально, там же reference, а не указатель.
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    в выражении a0 = bb происходит присваивание не ссылки, а объекта, который при этом приводится (неявно) к типу a_t. То есть, по аналогии, если написать:
    Код (Text):
    1. ...
    2. *a1 = bb;
    3. a1->print();
    то получим опять-таки a_t :)
     
  5. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    Да чето затормозил
    a0=bb; тож самое что aa=bb;
    просто думал что и виртуальные функции в аа замещаются.

    *a1 = bb;
    a1->print(); // извините но b_t
     
  6. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    Хотя не тоже самое (если чето добавить в а_t)
    ;
    ; {
    ; a0=bb;
    ;
    @1:
    mov eax,dword ptr [_a0]
    mov edx,dword ptr [_bb+4]
    mov dword ptr [eax+4],edx
    ;
    ; aa=bb;
    ;
    mov ecx,dword ptr [_bb+4]
    mov dword ptr [_aa+4],ecx
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    green5
    Хех... а и правда :dntknw: остается понять почему, ведь код по сути должен быть идентичен a0=bb;

    Архизабавно!
    Код (Text):
    1. int main()
    2. {
    3.   a0=bb;
    4.   a1=&bb;
    5.   a0.print();
    6.   a1->print();
    7.   *a1=bb;
    8.   a1->print();
    9.   return 0;
    10. }
    дает на выходе
    Код (Text):
    1. a_t
    2. b_t
    3. b_t
    а если вот так:
    Код (Text):
    1. int main()
    2. {
    3.   a0=bb;
    4.   a1=&aa; << извращаемся
    5.   a0.print();
    6.   a1->print();
    7.   *a1=bb;
    8.   a1->print();
    9.   return 0;
    10. }
    то получаем:
    Код (Text):
    1. a_t
    2. a_t
    3. a_t
    Вообще, конечно код очень опасный и не то, чтобы корректный, но тем не менее не противоречащий стандарту и вообще - чего бы это значило?
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Присваивание
    Код (Text):
    1. *a1=bb
    приводит к копированию общих полей a_t и b_t, но без копирования vtable ptr.

    Если a1 перед этим указывал на объект типа b_t, то в результате получится тот же объект b_t, с модифицированной a_t-частью, но с сохранением всего остального, в т.ч. и vtptr.
    В общем случае делать так, конечно, не стоит - возможно нарушение целостности объекта.
     
  9. KpeHDeJIb

    KpeHDeJIb New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    24
    Я когда не знаю что делать, пишу логирование сообщений в конструкторах, деструкторах и операторах копирования, присваивания обьектов и смотрю что вообще за каша получилась. Может стоит попробовать? Я вам обещаю, все сразу прояснится (: А пока смотрим и медитируем.
     
  10. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    Ну с логированием далеко не уедешь, но все равно както не по себе с этими
    reference, вот и использовать их тока при передаче параметров
     
  11. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    Да и код думаю не коррректный просто компилятор не отсекает это
    типа:
    int &a0=aa;
    ...
    a0=bb; // нельзя, а0 зарезервирован за аа
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    green5
    Почему нельзя? Просто в первом случае - это инициализация, а во втором - присваивание. Для ссылок - принципиально разные операции. Аналог в указателях будет выглядеть так:
    int const* a0 = &aa;
    ...
    *a = bb;