virtual , friend

Discussion in 'WASM.BEGINNERS' started by ltshck, Jan 21, 2008.

  1. ltshck

    ltshck New Member

    Blog Posts:
    0
    хай ту олл.
    смотрел 2 книги на эту тему...
    везде описывают по разному?

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

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

    AshBone New Member

    Blog Posts:
    0
    Первое.

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

    Code (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() могла получить доступ к приват и протектед данным и функциям, то ты должен в этом классе объявить функцию-друга (или дружественный класс), которая получит доступ:

    Code (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

    Blog Posts:
    0
    спасибо.

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

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

    wasm_test wasm test user

    Blog Posts:
    0
    как я помню, достаточно один раз
     
  5. varnie

    varnie New Member

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

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

    ltshck New Member

    Blog Posts:
    0
    а дополнительные, интересные возможности virtual знает кто?

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

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


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

    AshBone New Member

    Blog Posts:
    0
    ltshck

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

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

    varnie New Member

    Blog Posts:
    0
    ltshck,
    RTFM.

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

    ltshck New Member

    Blog Posts:
    0
    про

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

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

    AshBone New Member

    Blog Posts:
    0
    ltshck

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

    IceStudent Active Member

    Blog Posts:
    0
    ltshck
    Есть. ANSI ISO IEC 14882.

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

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

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

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

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

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

    varnie New Member

    Blog Posts:
    0
    IceStudent
    понял. впредь учту это.