virtual , friend

Тема в разделе "WASM.BEGINNERS", создана пользователем ltshck, 21 янв 2008.

  1. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    хай ту олл.
    смотрел 2 книги на эту тему...
    везде описывают по разному?

    неужели нет определенного стандарта и нормального объяснения как работает virtual int a()
    и friend int b() ?

    кто-нить может объяснить что такое первое и что такое второе?
    все возможности и нормально и по русски?
     
  2. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    Первое.

    Дело в том, что Указателю на базовый класс можно присваивать значение указателей на классов потомков. Допустим, у нас есть такая картина:

    Код (Text):
    1. class a
    2.  
    3. {
    4. ............
    5. virtual int test();
    6. int test2();
    7. };
    8.  
    9. ....
    10.  
    11. class b : public a
    12.  
    13. {
    14. virtual int test();
    15. int test2();
    16. };
    17.  
    18. и есть указатель
    19.  
    20. a* pointer;
    21.  
    22. теперь:
    23.  
    24. pointer  = new a;
    25.  
    26. pointer->test(); Вызывается a::test();
    27. pointer->test2(); Вызывается a::test2();
    28.  
    29. pointer = new b;
    30.  
    31. pointer->test(); Вызывается b::test();
    32. pointer->test2(); Вызывается a::test2();
    Второе.

    Как ты наверное знаешь, есть private свойства и методы какого либо класса, protected и public. Если ты хочешь, чтобы int b() могла получить доступ к приват и протектед данным и функциям, то ты должен в этом классе объявить функцию-друга (или дружественный класс), которая получит доступ:

    Код (Text):
    1. class a
    2.  
    3. {
    4. private:
    5.  
    6. int c;
    7. ............
    8. friend int b();
    9. }
    10.  
    11.  
    12.  
    13. int b()
    14.  
    15. {
    16. a* pointer = new a;
    17. pointer->c = 0; ---------> Теперь такое допустимо
    18. };
     
  3. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    спасибо.

    http://www.cplusplus.com/doc/tutorial/polymorphism.html тут тоже есть.
    но разница в том что там указали один раз virtual, а вы - два...

    опять нет однозначности... но суть уже понимаю. спасибо.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    как я помню, достаточно один раз
     
  5. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ltshck
    в классах потомках переопределяемый метод, объявленный как virtual в классе-родителе, можно не предварять этим ключевым словом, "virtual". это вводит небольшую путаницу при рассмотрении таких классов, но так не запрещено делать.
    тебя, видимо, именно это и смутило :)

    © "C++ in a Nutshell"
     
  6. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    а дополнительные, интересные возможности virtual знает кто?

    например вот это:

    virtual int a() = 0; не везде описано... а вещь клевая.


    тоже касается friend. это только классу? а к типу string (классу std::string) или int стандартному подходит?
    и как?
     
  7. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    ltshck

    Не понимаю почему чисто_виртуальные_классы именно "клевая" вещь...

    Что же касается френдов, то класс может зафрендить другие классы и функции. Указание френдов - это всего лишь раздача прав на доступ к приват/протектед методам и полям...
     
  8. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    ltshck,
    RTFM.

    ps: а вообще, имха, этот топик надо было в разделе C/C++ на форуме размещать. по С++, однако.
     
  9. ltshck

    ltshck New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    195
    про

    friend operator + (class1 a, class2 b);
    friend operator + (class2 a, class1 b);

    никто так и не написал. видимо не знал. вот я и спрашивал, есть ли еще такие красивые вещи...
    так как не в каждой RTFM описаны такие тонктости.
     
  10. AshBone

    AshBone New Member

    Публикаций:
    0
    Регистрация:
    12 дек 2007
    Сообщения:
    101
    ltshck

    А что, тебе должны были ОСОБО написать про operator +? Учись читать между строк и делать выводы из прочитанного...
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    ltshck
    Есть. ANSI ISO IEC 14882.

    В любом учебнике/хелпе по С++.

    Либо всему классу, либо его конкретной функции.

    Первому можно, второе не имеет смысла.

    Страуструп написал.

    РТФМ, однако. По всем вопросам.

    varnie
    Конкретно этому топику не место там, т.к. никакой полезной информации участникам форума не несёт. ТС разберётся и всё, а через некоторое время будет чистка подфорума.
     
  12. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    IceStudent
    понял. впредь учту это.