• 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

Cloud VPS
0 głosów
764 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 1,321 wizyt
pytanie zadane 4 czerwca 2019 w C# przez Magiqon Nowicjusz (160 p.)
0 głosów
1 odpowiedź 300 wizyt
0 głosów
0 odpowiedzi 210 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 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

Kursy INF.02 i INF.03
...