Skocz do zawartości

Problem z zastosowaniem polimorfizmu w programie


faustin

Pomocna odpowiedź

Dzień dobry wszystkim,

  mam nastepujący kod do programu, którego zadaniem będzie wyorzystanie polimorfizmu dla funkcji oblicz(), tyle tylko cały czas wyskakuja mi jakieś błedy podczas kompilacji , które mówią o tym ,że niby powinnam dac te klasy dziedziczne z klasy bazowej "figura" do przestrzeni nazw figura , ale jak próbuje to zrobić to nadal nie działa i nadal błedy wyskakują , dodam ,że kontruktory mająza zadanie zainicjować wartosci długosc podstawy i wysokość wartościami starowymi , które sa prywatne 

;


#include <iostream>

using namespace std;


  class figura
  {

  private:
    int podstawa;
    int wysokosc;
    public:
    figura(int podstawa, int wysokosc)
    {


      this->podstawa=podstawa;
      this->wysokosc=wysokosc;
  }

    virtual void oblicz()
    {
     cout<<"pole wynosi"<<endl;
    }
  };




   class trojkat:private figura{
      /// public:

      trojkat(int podstawa, int wysokosc)
       {
           this->podstawa=podstawa;
           this->wysokosc=wysokosc;
       }

     void oblicz()
     {
         cout<<"pole trojkata"<<(podstawa*wysokosc)*0.5;
     }

   };
   class prostokat :private figura{

     prostokat(int podstawa,int wysokosc)
     {

         this->podstawa=podstawa;
         this->wysokosc=wysokosc;
     }
     void oblicz()
     {
         cout<<"pole prostokata"<<podstawa*wysokosc;
     }

   };
int main()
{
      figura *i;
      trojkat trojkat(5,6);
      prostokat prostokat(9,7);
      trojkat.oblicz();
      prostokat.oblicz();
   i=&prostokat;
   i->oblicz();
   i=&trojkat;
   i->oblicz();


    return 0;
}


 


   

 

Link do komentarza
Share on other sites

O matko... ile pisania będzie... Postaram się w skrócie:

  1. Jeżeli chcesz mieć dostęp do zmiennych podstawa/wysokość w sub-klasach powinny one być "protected", a nie "private". Zmienne prywatne są zastrzeżone wyłącznie dla tej jednej klasy. Zmienne chronione są dla tej klasy i jej subklas.
  2. Ad. punktu 1 - jeżeli posiadasz konstruktory w subklasach muszą być określone jako public, o ile są wykorzystywane poza tą klasą (co ma miejsce w Twoim przypadku).
  3. Jeżeli dziedziczysz z klasy z metodą wirtualną implementacja tej metody w subklasach powinna zawierać słowo kluczowe "override". Np. 
    void oblicz() override { /* kod */ }
  4. Tworząc konstruktor sub-klasy nie musisz inicjować pól klasy bazowej, ponieważ (patrz punkt 5)
  5. Dziedzicząc z klasy bez pustego konstruktora (bez argumentów) konstruktory w sub-klasach powinny dziedziczyć z konstruktora argumentowego. Np.
    Pies(int wiek) : Zwierze(wiek)
    {
      // Kod
    }
  6. Jeżeli klasa podstawowa jest prywatna to konwersję między klasami musisz definiować jawnie. Przykład:
    Zwierze* zwierz;
    zwierz = (Zwierze*) moj_pies;

Teraz polecam spróbować samej rozwiązać problem. Gdyby wystąpiły problemy ze zrozumieniem: kod

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.