Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Polimorfizm i funkcje wirtualne


Rekomendowane odpowiedzi

Opublikowano

Siemanko, mam problem potrzebuje wytłumaczenia tak na chłopski rozum co to jest i co daje polimorfizm i funkcje wirtualne w c++. Czytałem dużo poradników ale jakoś jeszcze nie mogę do końca tego zrozumieć, proszę o szybką pomoc :)

Ponowne umieszczenie takiego linku skutkuje zbanowaniem konta.


Opublikowano
#include <iostream>
using namespace std;


class Figura{
public:
    virtual void rysuj(){
        cout<<"Figura\n";
    }
};


class Kolo : public Figura{
public:
    void rysuj(){
        cout<<"Kolo\n";
    }
};


int main(){
    Figura* figura = new Kolo;
    figura->rysuj();
}

Skompiluj i zobacz wynik. Następnie usuń słówko virtual i skompiluj jeszcze raz. Zakładam, że wiesz, czym jest dziedziczenie, zasłanianie funkcji, dynamiczna alokacja pamięci, wskaźniki itp. Może sam dojdziesz do tego, gdzie ten mechanizm może się przydać :).

 

PS. Dodam, że działa to jedynie w przypadku dynamicznej alokacji.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

" Dodam, że działa to jedynie w przypadku dynamicznej alokacji. " 

Bullshit. 

Polimorfizm nie ma nic wspólnego z dynamiczną alokacją. 

void callee ( Figura& f ) { 
   f.rysuj(); 
}

void caller() {  
    Kolo k; 
    callee(k);
    printf( k.czyNarysowane() );
}

Tak na chłopski rozum to się nie da. 

Tak w jednym zdaniu to: Pozwala operować na obiektach bez wiedzy o tym, czym one są ( mimo, że zachowują się w sposób, w jaki chcą ). 

Tak, żeby zrozumieć: http://www.parashift.com/c++-faq/virtual-functions.html

 

Jest to najważniejszy aspekt OO.

Przykład powyżej jest trochę bez sensu, jak większość przykładów. Rozszerzmy jednak funkcję rysuj() w klasie ( która prawie na pewno powinna być czysto wirutalna ) Figura do postaci: 

 

 

public: virtual void rysuj( Kontekst*, RGB ) = 0;

( końcówka " = 0;" oznacza funkcję czysto wirtualną. 

Funkcji czysto wirtualnej nie można wywołać. Jest to abstrakcyjny konstrukt. 

Każda klasa, która posiada choć jedną funkcję wirtualną, jest klasą wirtualną. 

Obiektu klasy czysto wirtualnej nie możemy stworzyć. Jest to abstrakcyjny konstrukt. Możemy tylko z niego dziedziczyć. ) 

 

Oraz funkcję callee() do postaci: 

 

 

void callee(Figura& f) { 
   Kontekst* kontekst = pobierzKontekstRysowaniaZSystemu(); 
   RGB kolor = pobierzKolorUstwaionyPrzezUzytkownika(); 
   f.rysuj(kontekst, kolor); 
}

 

I stworzyliśmy całkiem niegłupi sposób na wrysowanie dowolnej figury bezpośrednio na ekran. 

Gdybyśmy kiedyś chcieli rozszerzyć funkcjonalność aplikacji o figury siedmiowymiarowe rzutowane na dwuwymiarową płaszczyznę - wystarczyłoby zdefiniować odpowiednią dla nich klasę i sposób rysowania, bez potrzeby ingerowania w żaden starszy kod, który pisaliśy nie mając nawet pojęcia, że pięć wymiarów można rzutować na dwa.

Ta sygnatura jest pusta.

Opublikowano

" Dodam, że działa to jedynie w przypadku dynamicznej alokacji. " 

 

Bullshit. 

Polimorfizm nie ma nic wspólnego z dynamiczną alokacją. 

void callee ( Figura& f ) { f.rysuj(); }

Tak na chłopski rozum to się nie da. 

Tak w jednym zdaniu to: Pozwala operować na obiektach bez wiedzy o tym, czym one są ( mimo, że zachowują się w sposób, w jaki chcą ). 

Tak, żeby zrozumieć: http://www.parashift.com/c++-faq/virtual-functions.html

 

Jest to najważniejszy aspekt OO.

 

Okej źle określiłem, chodziło mi o wskaźniki i referencje, bo przekazując np pełny obiekt do funkcji bez referencji lub wskaźnika, zostanie on okrojony:

void callee ( Figura f ) { f.rysuj(); }// bez względu na wszystko wyświetli Figura. 

Ale też za dużo się nie pomyliłem :).


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...