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

Kiedy dodajemy do metody virtual a kiedy nie? Polimorfizm

Object Storage Arubacloud
0 głosów
193 wizyt
pytanie zadane 14 lutego 2017 w C i C++ przez Jedyn Obywatel (1,200 p.)
edycja 14 lutego 2017 przez Jedyn

Witam. Tak jak w temacie, nie mam pojęcia kiedy do metody dodać virtual a kiedy nie.
Przykładowe zadanie: http://docdro.id/VOmJR8N
Ogólnie ogarniam w miarę polimorfizm, ale nie wiem do których metod używać virtual.

Oraz klasa bez implementacji: 

class XBox
{
    const int dysk;
    const string model;
    int gwarancja;
    double cena;
protected:
    virtual void Dane();
    virtual void Gwarancja();
public:
    XBox(int dysk, string model,double cena, int gwarancja=12):dysk(dysk>0?dysk:500),model(model),cena(cena>0?cena:500.0),gwarancja(gwarancja>=0?gwarancja:12)
    {}
    virtual void rozszerzGwarancje(int ileMies);
    void Wyswietl();

 

Dla czego akurat dodajemy virtuala do Gwarancja oraz Dane a do void Wyswietl() już nie?

2 odpowiedzi

+1 głos
odpowiedź 14 lutego 2017 przez Evelek Nałogowiec (28,960 p.)
Wtedy dodajemy, kiedy klasa pochodna używa tych samych metod co klasa bazowa.
komentarz 14 lutego 2017 przez Jedyn Obywatel (1,200 p.)
W sensie kiedy przesłania metody z klasy bazowej tak?
komentarz 14 lutego 2017 przez Evelek Nałogowiec (28,960 p.)
Tak, ale patrz odpowiedź Crissa. W przypadku polimorfizmu jest to najlepiej widoczne.
+1 głos
odpowiedź 14 lutego 2017 przez criss Mędrzec (172,590 p.)

Metody wirtualne pozwalają na wywołanie właściwiej metody w przypadku polimorfizmu.

struct Base
{
   virtual void f() { std::cout << "Base::f\n"; }
   void g() { std::cout << "Base::g\n"; }
   virtual ~Base() = default; // dla zasady
};

struct Derived : Base
{
   void f() override { std::cout << "Derived::f\n"; } // override nie jest konieczne, ale ułatwia czytanie kodu
   void g() { std::cout << "Derived::g\n"; }
};

Derived d;
Base * ptr = &d;
ptr->f(); // Derived::f
ptr->g(); // Base::g

 

Podobne pytania

0 głosów
1 odpowiedź 333 wizyt
0 głosów
1 odpowiedź 499 wizyt
0 głosów
1 odpowiedź 303 wizyt

92,565 zapytań

141,418 odpowiedzi

319,602 komentarzy

61,951 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!

...