Reklama
Pokazuje wyniki od 1 do 6 z 6

Temat: [c++] Polimorfizm nie trybi

  1. #1
    Avatar Celestian hunter
    Data rejestracji
    2006
    Położenie
    Gliwice
    Wiek
    32
    Posty
    1,059
    Siła reputacji
    19

    Domyślny [c++] Polimorfizm nie trybi

    Kombinuję od dłuższego czasu, ale chyba mnie to przerasta ._.
    Krótki wstęp: program obsługuje sklep i robię teraz klasy sprawdzające promocje - jest bazowa z jakimś ogólnym rabatem i potomne, bardziej rozwinięte. Wszystkie one mają funkcje 'void oblicz_procent(różne-typy-argumentów)', która w bazowej jest virtualna.
    Trochę kodu:

    Kod PHP:
    //Klasa-bazowa.h:
    virtual void oblicz_procent(void);
    
    //Klasa-bazowa.cpp:
    void Klasa-bazowa::oblicz_procent(void)
    {
    	(...)
    }
    
    //Klasa-pochodna.h:
    void oblicz_procent (Klient * Konto_klienta);
    
    //Klasa-pochodna.cpp:
    void Klasa-pochodna::oblicz_procent (Klient * Konto_klienta)
    {
        (...)
    }
    
    
    //główna funkcja:
    (...)
    Klasa-bazowa * Karta_Stalego_Klienta = new Klasa-bazowa();
    if(Karta_Stalego_Klienta->sprawdza-czy-nalezy-sie-inna-promocja())
    {//jesli tak
        delete Karta_Stalego_Klienta;
        Karta_Stalego_Klienta = new Klasa-pochodna();
        Karta_Stalego_Klienta->oblicz_procent(Konto_Klienta); // BŁĄD - kompilator ciągle 'patrzy' na funkcję z klasy bazowej i nie pasuje mu argument 'Konto_Klienta'
    }

    oczywiście nazwy klas zmieniłem tu, żeby były bardziej czytelne


    Nie ogarniam c++ i strasznie ciężko przyswajam ten język, więc pewnie popełniam tu jakiś głupi, prosty błąd. Niemniej nie potrafię go znaleźć.. ;d
    Będę bardzo wdzięczny za jakąś pomoc

  2. #2
    Avatar Gray
    Data rejestracji
    2007
    Położenie
    Gdańsk
    Posty
    2,847
    Siła reputacji
    18

    Domyślny

    Jak masz wskaźnik na klasę bazową, to żeby z jego poziomu użyć jakiejś metody, klasa bazowa również musi ją mieć. W tym momencie próbujesz użyć oblicz_procent z parametrem Klient ze wskaźnika typu klasy bazowej, podczas gdy klasa bazowa nie ma takiej metody.

    Musisz w klasie bazowej również zrobić metodę z tym parametrem żeby dało się tak tego użyć. Nie musisz nawet pisać "środka" funkcji, wystarczy coś takiego:
    Kod PHP:
    virtual void oblicz_procent(Klient*) = 0;
    Wtedy funkcja jest czysto wirtualna, nie musisz nic pisać w środku, ale nie można tworzyć obiektów klasy bazowej, tylko klasy pochodne, które mają tą funkcję dokończoną.

  3. Reklama
  4. #3
    Avatar Celestian hunter
    Data rejestracji
    2006
    Położenie
    Gliwice
    Wiek
    32
    Posty
    1,059
    Siła reputacji
    19

    Domyślny

    oooo dzięki <3

    Nie wiedziałem nawet, że tak to działa - myślałem, że tylko wartość zwracana w obu funkcjach musi być tego samego typu ;d
    Wprawdzie nie planowałem mieć bazowej abstrakcyjnej, ale zrobiłem sobie
    Kod PHP:
    virtual void oblicz_procent(Klient*){}
    i chyba wszystko cacy.

    Dzięki jeszcze raz, wyślę parcela, jak tylko mi limit zejdzie ;d

  5. #4

    Data rejestracji
    2010
    Posty
    2,657
    Siła reputacji
    16

    Domyślny

    W momencie kompilacji nadal pokazjesz ze Karta_Stalego_Klienta jest typem Klasa_Bazowa, a poniewaz probujesz wywolac metode wirtualna, kompilator sie pluje.
    @Edit
    W ogole po cholere robisz ta klase bazowa skoro mowisz sam ze jest to klasa abstrakcyjna? Taka klasa nie powinna mieć instancji.

  6. #5
    Avatar Kusterek
    Data rejestracji
    2013
    Położenie
    Warszawa
    Wiek
    31
    Posty
    1,710
    Siła reputacji
    13

    Domyślny

    @top
    kolega wyzej dobrze mowi, klasa abstrakcyjna nie moze miec swoich reprezentantów pod postacią obiektów.

    virtual void oblicz_procent(Klient*){}
    Nie jest metodą czysto wirtualną! bo ma ciało {}, puste ale ma. Wiec juz nie jest to klasa abstrakcyjna.

    musisz implementowac metody czysto wirtualne tak jak pokazał Ci kolega Gray.

    btw. Jest tu moze jakis dzial odrebny dla programowania czy nie?

  7. #6
    Avatar Celestian hunter
    Data rejestracji
    2006
    Położenie
    Gliwice
    Wiek
    32
    Posty
    1,059
    Siła reputacji
    19

    Domyślny

    Może coś źle sformułowałem, to sprostuję - nie planowałem, by klasa bazowa była klasą abstrakcyjną. Chcę mieć możliwość tworzenia jej obiektów, dlatego z pełną świadomością zrezygnowałem z metody czysto wirtualnej.

    btw. Jest tu moze jakis dzial odrebny dla programowania czy nie?
    Niestety nie ma; niektórzy tworzą tematy o tym w Sprzęcie i Oprogramowaniu, ja wolę w tym dziale.

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Nie ufac nikomu to podstawa by nie stracic wszystkiego!
    Przez konto usunięte w dziale Tibia
    Odpowiedzi: 123
    Ostatni post: 22-02-2018, 15:31
  2. [8.54][NPC-lua] Nie trybi kiedy pisze yes kiedy pisze no trybi
    Przez cyrek w dziale Strefa developerska
    Odpowiedzi: 0
    Ostatni post: 31-07-2010, 17:10
  3. Nigdy nie wychodz do wc jak sie nie wylogujesz.
    Przez Grzybcio vick w dziale Tibia
    Odpowiedzi: 0
    Ostatni post: 14-09-2008, 17:05
  4. Odpowiedzi: 18
    Ostatni post: 30-11-2006, 22:08

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •