• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Metody wirtualne a funkcje zaprzyjaźnione

Object Storage Arubacloud
0 głosów
670 wizyt
pytanie zadane 23 października 2017 w C i C++ przez Czarus0 Obywatel (1,040 p.)
Wiem, że funkcje zaprzyjaźnione nie są dziedziczone, ale czy da się jakoś zapisać operator<< tak, aby wskaźnik klasy bazowej, wskazujący na klasę pochodną, wyświetlał dane klasy pochodnej czy tylko to jest możliwe tworząc metody wirtualne typu Show()? Wiem, że da się stworzyć zaprzyjaźnienie funkcji operator<< dla każdej klasy i stworzony obiekty danej klasy w funkcji main wywoływałby swoją funkcję zaprzyjaźnioną (cout << obiekt).

1 odpowiedź

+1 głos
odpowiedź 23 października 2017 przez Patrycjerz Mędrzec (192,320 p.)
wybrane 23 października 2017 przez Czarus0
 
Najlepsza

Nie możesz stworzyć operatora << jako metody wirtualnej, gdyż sam zapis

std::cout << obiekt;

to uniemożliwia. W tym przypadku możliwa jest jedynie funkcja pobierająca dwa argumenty: jeden zwyczajowo std::ostream, drugi zaś to polimorficzna referencja. Zobacz przykład.

#include <iostream>
    
struct B
{
    B(int i) : b(i) {}
    
    virtual void print() const = 0;
    
    int b;
};

struct C : B
{
    C(int i) : B(i + 1), a(i) {}
    
    void print() const
    {
        std::cout << "Obiekt klasy C: " << a << ' ' << b << '\n';
    }

    int a;
};

std::ostream& operator<<(std::ostream& os, const B& obj)
{
    obj.print();
    return os;
}

int main()
{
    C obj1(10), obj2(20), obj3(30);
    std::cout << obj1 << obj2 << obj3;
    /* lub
       obj1.print();
       obj2.print();
       obj3.print();
    */
    B* wsk = &obj2;
    std::cout << *wsk;
}
komentarz 23 października 2017 przez Czarus0 Obywatel (1,040 p.)
Rozumiem, czyli wystarczy zdefiniować ogólną funkcję operator<< przyjmującą jeden z argumentów jako referencję do klasy bazowej, a w niej po prostu wywołać metodę wirtualną wyświetlającą dane danej klasy? :)
komentarz 23 października 2017 przez Patrycjerz Mędrzec (192,320 p.)

W rzeczy samej smiley Po prostu na przykładzie lepiej niektóre rzeczy widać, ale cieszę się, że go rozumiesz.

komentarz 23 października 2017 przez Czarus0 Obywatel (1,040 p.)
Dziękuję bardzo za poświęcony czas i rzetelne wytłumaczenie :)

Podobne pytania

0 głosów
0 odpowiedzi 974 wizyt
pytanie zadane 4 czerwca 2019 w C# przez Magiqon Nowicjusz (160 p.)
0 głosów
1 odpowiedź 207 wizyt
0 głosów
0 odpowiedzi 167 wizyt

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...