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

C++ , polimorfizm

Object Storage Arubacloud
0 głosów
964 wizyt
pytanie zadane 22 stycznia 2016 w C i C++ przez Ziuziek Mądrala (5,140 p.)
Prosze sie nie smiac o jakosc skryptu, bo pisze glupie programy by pocwiczyć :D Wydaje mi sie ze wszystko dobrze pisze a mam bledy odnosnie vtable albo reference pokaz_plec i ile_nog

 

http://wklej.org/id/1914554/

Prosze zerknijcie to latwy skrypt.

2 odpowiedzi

0 głosów
odpowiedź 22 stycznia 2016 przez maly Nałogowiec (37,190 p.)

W klasie Zwierze, najpierw poinformowałeś kompilator że będzie brak metody metody virtual void pokaz_plec() = 0,a jednak niżej zdefiniowałeś ją.
Potem w klasie Hipopotan poinformowałeś kompilator że metoda void pokaz_plec() będzie a jej niezdefiniowałeś.

komentarz 22 stycznia 2016 przez Ziuziek Mądrala (5,140 p.)
Tak ale robilem to na podstawie tego zadania i tu wszystko dziala :

http://wklej.org/id/1914596/
komentarz 22 stycznia 2016 przez Ziuziek Mądrala (5,140 p.)
A

  virtual void pokaz_plec() = 0;

    virtual void ile_nog() = 0;

To sie nie nazywa czysta funkcja wirtualna ktora sie tu wpierw deklaruje a potem dodaje sie jej funkcje a na koncu wskaznikiem sie nie przechodzi?
komentarz 22 stycznia 2016 przez Szykem2 Nałogowiec (29,510 p.)
edycja 22 stycznia 2016 przez Szykem2
Jak jest virtual void fun() =0; to znaczy, że jest to funkcja czysto wirtualna czyli, że dana klasa jest klasą abstrakcyjną co w konsekwencji daje, że nie można utworzyć instancji danej klasy. Funkcja czysto wirtualna może mieć definicje, która zostanie może zostać użyta użyta w klasie dziedziczącej.
0 głosów
odpowiedź 22 stycznia 2016 przez arek01996 Stary wyjadacz (12,100 p.)
class Zwierze
{
    public:
    string plec;
    int ilosc_nog;
    virtual void pokaz_plec() = 0;
    virtual void ile_nog() = 0;

};

void Zwierze::pokaz_plec()
{
    if(plec=="facet") cout << "Plec meska" << endl;
    else cout << "Plec zenska" << endl;
}

void Zwierze::ile_nog()
{
    if(ilosc_nog==4) cout << "jest to zwierze" << endl;
        else cout << "jednak nie jest to zwierze" << endl;
}

Zdecyduj się albo tworzysz pustą funkcję czyli fraza = 0; w ciele klasy albo je potem inicjujesz.

Wydaje mi się, że nie można tych rzeczy ze sobą łączyć...

Hipcio ma tylko dziedziczyć te funkcje zawarte w klasie abstrakcyjnej Zwierze, a w ciele hipcia masz ustalić co one będą robić. Lub po prostu usuń = 0; ze Zwierzęta wtedy to już nie będzie klasa abstrakcyjna i będziesz ją mógł nawet zainicjować.

 

np:

#include <iostream>
#include <string.h>
#include <string>
using namespace std;
class Zwierze
{
    public:
    string plec;
    int ilosc_nog;
    virtual void pokaz_plec() = 0;
    virtual void ile_nog() = 0;

};


class Hipopotan :public Zwierze
{
public:
    string plec;
    int ilosc_nog;
    void pokaz_plec();
    void ile_nog();
    Hipopotan(string _plec= "facet", int _ilosc_nog=4)
    {
        plec = _plec;
        ilosc_nog = _ilosc_nog;
    }
    void wypisz()
    {
        cout << plec <<  " "  << ilosc_nog << endl;
    }
};

void Hipopotan::pokaz_plec()
{
    if(plec=="facet") cout << "Plec meska" << endl;
    else cout << "Plec zenska" << endl;
}

void Hipopotan::ile_nog()
{
    if(ilosc_nog==4) cout << "jest to zwierze" << endl;
        else cout << "jednak nie jest to zwierze" << endl;
}


int main()
{
    Hipopotan hip1;
    hip1.ile_nog();
    hip1.pokaz_plec();
    return 0;
}

 

komentarz 22 stycznia 2016 przez Ziuziek Mądrala (5,140 p.)
Aaaa czyli kod byl dobry tylko chodzilo o to ze wpierw musialem napisac klase hipcia w ktorym uwzglednic funkcje virtualne musialem a pod nim dopiero rozwiniecie funkcji pokaz_plec i
 ile_nog?
komentarz 22 stycznia 2016 przez maciek061 Gaduła (4,490 p.)
Chyba tak :)
komentarz 22 stycznia 2016 przez Szykem2 Nałogowiec (29,510 p.)
Nie ma czegoś takiego jak pusta funkcja '= 0;' informuje o czystowirtualności funkcji. Nie stoi to na przeszkodzie temu aby takową zdefiniować. Dzięki temu w klasach dziedziczących można użyć po prostu A::fun(); co załatwia sprawę. (A to nazwa klasy abstrakcyjnej)
1
komentarz 1 września 2017 przez niezalogowany
+1 za hipcie

Podobne pytania

0 głosów
1 odpowiedź 582 wizyt
pytanie zadane 25 czerwca 2018 w C i C++ przez niezalogowany
+1 głos
0 odpowiedzi 2,378 wizyt
0 głosów
1 odpowiedź 302 wizyt

92,555 zapytań

141,403 odpowiedzi

319,558 komentarzy

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

...