<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem wirtualne</title>
<link>https://forum.pasja-informatyki.pl/tag/wirtualne</link>
<description>Powered by Question2Answer</description>
<item>
<title>Zmienne wirtualne. Jak napisać żeby było czytelnie i wydajnie?</title>
<link>https://forum.pasja-informatyki.pl/563422/zmienne-wirtualne-jak-napisac-zeby-bylo-czytelnie-i-wydajnie</link>
<description>

&lt;p&gt;Problem wygląda tak&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;

class Square
{
public:
    virtual void event() = 0;
};

class GoToJail : public Square
{
public:
    const int type = 0;

    void event()
    {
        //jakis kod
    }
};

class Property : public Square
{
public:
    const int type = 1;

    void event()
    {
        //jakis kod
    }
};

class Empty : public Square
{
public:
    const int type = 2;

    void event()
    {
        //jakis kod
    }
};

int main()
{
    Property property[ 3 ];
    Empty empty;
    GoToJail gotojail;

    Square *square[ 5 ];

    square[ 0 ] = &amp;amp;empty;
    square[ 1 ] = &amp;amp;property[ 0 ];
    square[ 2 ] = &amp;amp;property[ 1 ];
    square[ 3 ] = &amp;amp;property[ 2 ];
    square[ 4 ] = &amp;amp;gotojail;

    std::cout &amp;lt;&amp;lt; square[ 3 ] -&amp;gt; type;

    return 0;
}
&lt;/pre&gt;



&lt;p&gt;Jak zrobić żeby pisząc square[ n ] -&amp;gt; type wyświetlało mi typ pola o indeksie n? Można dodać virtual int getType() każdej klasie ale wydaje mi się że dodawanie dodatkowej metody jest trochę nieładne i też nie wiem czy wywoływanie tej metody nie jest mniej wydajne od przekazywania od razu zmiennej. Czytałem też coś o dynamic_cast ale też to rozwiązanie intuicyjnie nie wydaje mi się najbardziej optymalne. Jak profesjonalny programista by to rozwiązał?&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/563422/zmienne-wirtualne-jak-napisac-zeby-bylo-czytelnie-i-wydajnie</guid>
<pubDate>Wed, 23 Mar 2022 21:02:06 +0000</pubDate>
</item>
<item>
<title>Co to jest wirtualny destruktor i do czego służy?</title>
<link>https://forum.pasja-informatyki.pl/535088/co-to-jest-wirtualny-destruktor-i-do-czego-sluzy</link>
<description>Co to jest wirtualny destruktor i do czego służy? W Eclipse for C++ jak się generuje nową klasę to powstaje destruktor, który jest wirtualny. Czemu tak jest?</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/535088/co-to-jest-wirtualny-destruktor-i-do-czego-sluzy</guid>
<pubDate>Mon, 29 Mar 2021 19:25:34 +0000</pubDate>
</item>
<item>
<title>Klasy abstrakcyjne i destruktor wirtualny</title>
<link>https://forum.pasja-informatyki.pl/493154/klasy-abstrakcyjne-i-destruktor-wirtualny</link>
<description>

&lt;p&gt;Witam, Mam problem z poniższym kodem . Z góry dziękuję&amp;nbsp;&amp;nbsp;za pomoc.&lt;/p&gt;



&lt;p&gt;C:\Users\Mateusz_2\Desktop\programy\rozdz14 zad 4\person.h|68|undefined reference to `PokerPlayer::~PokerPlayer()'|&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;p&gt;C:\Users\Mateusz_2\Desktop\programy\rozdz14 zad 4\person.h|68|undefined reference to `Gunslinger::~Gunslinger()'|&lt;/p&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#ifndef PERSON_H_
#define PERSON_H_
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;ctime&amp;gt;



using std::string;

class Person
{
private:
    string imie;
protected:
    virtual void dane() const;
    virtual void Get();

public:
    Person(): imie(&quot;Brak&quot;){}
    Person(const string &amp;amp; name) : imie(name){}
    virtual ~Person()=0;
    virtual void show() const=0;
    virtual void setall()=0;
};

class Gunslinger : virtual public Person
{
private:
    double czas;
    int naciecia;
protected:
    virtual void dane() const;
    virtual void Get();
public:
    Gunslinger() :Person(), czas(0), naciecia(0) {}
    Gunslinger(const string &amp;amp; name,  double time, int nac) : Person(name), czas(time), naciecia(nac) {}
    Gunslinger(const Person &amp;amp; p, double time, int nac) : Person(p), czas(time), naciecia(nac) {}
    ~Gunslinger();
    double draw() const {return czas;}
    void show() const;
    void setall();


};

class PokerPlayer : public virtual Person
{
private:
    int liczba;
protected:
      virtual void Get();
    virtual void dane() const;

public:
    PokerPlayer(): Person(), liczba(0){}
    PokerPlayer(const Person &amp;amp; p, int licz): Person(p), liczba(licz){}
    PokerPlayer(const string &amp;amp; name, int licz) : Person(name), liczba(licz){}
     ~PokerPlayer();
    int  draw() const;
    void show() const;
    void setall();

};

class BadDude : public Gunslinger, public PokerPlayer
{
     virtual void dane() const;
         virtual void Get();
public:
    BadDude() : Gunslinger(), PokerPlayer() {}
    BadDude(const string &amp;amp; name,  double time, int nac, int licz) : Person(name), Gunslinger(name, time, nac), PokerPlayer(name, licz){}
    BadDude(const Gunslinger &amp;amp; g, int licz ): Person(g), Gunslinger(g), PokerPlayer(g,licz){}
    BadDude(const Person &amp;amp; p, double time, int nac, int licz) :Person(p), Gunslinger(p,time,nac), PokerPlayer(p, licz){}
    BadDude(const PokerPlayer &amp;amp; pp, double time, int nac): Person(pp), Gunslinger(pp,time, nac), PokerPlayer(pp){}
    double Gdraw() const;
    int Cdraw() const;
    void show() const;
    void setall();


};



#endif // PERSON_H_
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &quot;person.h&quot;
#include &amp;lt;string&amp;gt;
#include &amp;lt;cstdlib&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;ctime&amp;gt;



using namespace std;


     void Person::dane() const
     {
         cout&amp;lt;&amp;lt;&quot;Imie i nazwisko: &quot;&amp;lt;&amp;lt;imie;
     }
     void Person::Get()
     {
         cout&amp;lt;&amp;lt;&quot;Podaj imie i nazwisko: &quot;;
         getline(cin, imie);
         while(cin.get() != '\n')
            continue;
     }


    void Gunslinger::dane() const
    {
        cout&amp;lt;&amp;lt;&quot;\nCzas wyciagania rewolweru: &quot;&amp;lt;&amp;lt;czas;
        cout&amp;lt;&amp;lt;&quot;\nLiczba naciec na rewolwerze: &quot;&amp;lt;&amp;lt;naciecia;
    }
    void Gunslinger::Get()
    {
        cout&amp;lt;&amp;lt;&quot;\nPodaj czas wyciagania rewolweru: &quot;;
        cin&amp;gt;&amp;gt;czas;
        cout&amp;lt;&amp;lt;&quot;\nPodaj liczbe naciec na rewolwerze: &quot;;
        cin&amp;gt;&amp;gt;naciecia;
    }
    void Gunslinger::show() const
    {
        cout&amp;lt;&amp;lt;&quot;\nRewolwerwiec\n &quot;;
        Person::dane();
        dane();
    }
    void Gunslinger::setall()
    {
        Person::Get();
        Get();
    }


    void PokerPlayer::Get()
    {
        Person::Get();
    }
    void PokerPlayer::dane() const
    {
        cout&amp;lt;&amp;lt;&quot;Numer karty: &quot;&amp;lt;&amp;lt;liczba;
    }
    int  PokerPlayer::draw() const
    {
        srand(time(NULL));
      return rand()%52+1;
    }
    void PokerPlayer::setall()
    {
        Get();
    }
    void PokerPlayer::show() const
    {
        cout&amp;lt;&amp;lt;&quot;\nPokerzysta\n&quot;;
        Person::dane();
        dane();
    }

     void BadDude::dane() const
     {
         Gunslinger::dane();
         PokerPlayer::dane();
     }
     void BadDude::Get()
     {
         Gunslinger::Get();
         PokerPlayer::Get();
     }
    double BadDude::Gdraw() const
    {
        return Gunslinger::draw();
    }
    int BadDude::Cdraw() const
    {
        return PokerPlayer::draw();
    }
    void BadDude::show() const
    {
        cout&amp;lt;&amp;lt;&quot;\nBadDude\n&quot;;
        dane();
        cout&amp;lt;&amp;lt;&quot;\nCzas wyciagnania rewolweru: &quot;&amp;lt;&amp;lt;Gdraw();
        cout&amp;lt;&amp;lt;&quot;\nLosowa karta od 1 do 52: &quot;&amp;lt;&amp;lt;Cdraw();
    }
    void BadDude::setall()
    {
        Get();
    }
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include  &amp;lt;iostream&amp;gt;
#include &quot;person.h&quot;

using namespace std;

int main()
{
    const int SIZE = 5;
    Person * Tab[SIZE];
    int ct;
    for (ct = 0; ct &amp;lt;SIZE; ct++)
    {
        int choice;
        cout &amp;lt;&amp;lt; &quot;Kim chcesz byc???? :D\n&quot;
                &quot;1: pokerzysta, 2: rewolwerowiec, 3: Zly gosc!, 4: wyjscie\n&quot;;
        while (!(cin &amp;gt;&amp;gt; choice) &amp;amp;&amp;amp; (choice == 1 || choice == 2 || choice == 3 || choice == 4))
        {
            cout &amp;lt;&amp;lt;&quot;Wpisz 1 lub 2 lub 3 lub 4!&quot;;
        }
        if (choice == 4)
            break;
        switch(choice)
        {
           case 1 : Tab[ct] = new PokerPlayer; //Tutaj jest blad
                break;
            case 2 : Tab[ct] = new Gunslinger;
                break;
            case 3 : Tab[ct] = new BadDude;
                break;
        }
        cin.get();
        Tab[ct]-&amp;gt;setall();
    }
    cout &amp;lt;&amp;lt;&quot;\nLista bohaterow:\n&quot;;
    int i;
    for (i = 0; i &amp;lt; ct;i++)
    {
        cout&amp;lt;&amp;lt;endl;
        Tab[i]-&amp;gt;show();
    }
    for (i = 0; i &amp;lt; ct; i ++)
        delete Tab[i];

    cin.get();
    cin.get();
    return 0;
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/493154/klasy-abstrakcyjne-i-destruktor-wirtualny</guid>
<pubDate>Sun, 07 Jun 2020 16:57:49 +0000</pubDate>
</item>
<item>
<title>Funkcje wirtualne</title>
<link>https://forum.pasja-informatyki.pl/410444/funkcje-wirtualne</link>
<description>Cześć,&lt;br /&gt;
&lt;br /&gt;
Mam problem ze zrozumieniem przydatności i możliwości jakie dają funkcje wirtualne. Pewnie wynika to z faktu, że &amp;quot;wydaje&amp;quot; mi się, że rozumiem temat.&lt;br /&gt;
&lt;br /&gt;
Przechodząc do rzeczy. Jeśli ktoś ma pomysł jak na najprostszych przykładach z życia wziętych, wytłumaczyć możliwości jakie dają funkcje wirtualne, będę ogromnie wdzięczny. Czemu lepiej użyć takiej metody niżeli pisania dla każdego obiektu osobnej np nazwanej tak samo lub odziedziczonej.&lt;br /&gt;
&lt;br /&gt;
Ja to widzę mniej więcej tak: Po co tworzyć f. wirtualną, potem wskaźniki itp. skoro i tak każdą metodę musimy napisać jeszcze raz, ponieważ różne obiekty mogą mieć różne właściwości danej metody. Piszemy każdą osobno (bo i tak musimy to zrobić) następnie tylko używamy obiekt.metoda(); i gotowe w przypadku funkcji wirtualnych, dochodzą wskaźniki itp. &lt;br /&gt;
&lt;br /&gt;
Nie zrozumcie mnie źle, ja nie próbuję negować przydatności f. wirtualnych, dlatego opisałem jak ja to widzę, żeby osoba, która to przeczyta wskazała błąd w moim rozumowaniu.</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/410444/funkcje-wirtualne</guid>
<pubDate>Tue, 29 Jan 2019 17:22:46 +0000</pubDate>
</item>
<item>
<title>(czysto) wirtualny destruktor</title>
<link>https://forum.pasja-informatyki.pl/398955/czysto-wirtualny-destruktor</link>
<description>

&lt;p&gt;Witam, ostatnio natknął się na taki problem, że chciałem stworzyć czysto wirtualny destruktor, więc napisałem taki kod:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

class Ca
{
public:

      virtual ~Ca() = 0;
};

class Cb :public Ca
{

public:

      virtual ~Cb()
      {
          cout &amp;lt;&amp;lt; &quot;(obiekt) UMIERAM!!!&quot; &amp;lt;&amp;lt; endl;
      }

};

int main()
{
   Ca *wsk = new Cb;

   delete wsk;

   return 0;
}
&lt;/pre&gt;



&lt;p&gt;I nagle kompilator pokazał błąd, więc postanowiłem napisać tego destruktora normalnie wirtualnego, czyli z ciałem i wyszło, że tym razem kod działał.
&lt;br&gt;

&lt;br&gt;
&lt;strong&gt;I teraz mam takie pytanie, czy to oznacza, że wirtualnych destruktorów nie można pisać jako czyste metody wirtualne? &lt;/strong&gt;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/398955/czysto-wirtualny-destruktor</guid>
<pubDate>Sat, 08 Dec 2018 13:04:07 +0000</pubDate>
</item>
<item>
<title>Metoda wirtualna vs czysto wirtualna</title>
<link>https://forum.pasja-informatyki.pl/333859/metoda-wirtualna-vs-czysto-wirtualna</link>
<description>

&lt;p&gt;Hej. Na podstawię tego wpisu dotyczącego polimorfizmu w C#:&lt;/p&gt;



&lt;p&gt;&lt;a href=&quot;https://www.p-programowanie.pl/c-sharp/metody-wirtualne-abstrakcyjne-i-polimorfizm/&quot; rel=&quot;nofollow&quot;&gt;https://www.p-programowanie.pl/c-sharp/metody-wirtualne-abstrakcyjne-i-polimorfizm/&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Postanowiłam napisać taki prosty programik w C++ aby utrwalić zdobytą wiedzę dotycząca róznic między metodami wirtualnymi a abstrakcyjnymi. Z tacji tego, ze C++ metod abstrakcyjnych nie ma to wykorzystałam metodę czysto wirtualna w przypadku figur i zwykła wirtualna w przypadku pracowników. Wybaczcie istnienie zmiennych napisanych po polsku ale nie miałam zbytnio czasu no i zapomniałam o zasadach nazewnictwa xD.&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot; title=&quot;ksztalt.h&quot;&gt;
#ifndef KSZTALT_H
#define KSZTALT_H

class Ksztalt
{
public:
    virtual float Oblicz() = 0;
};

class Kwadrat: public Ksztalt
{
    float a;
public:
    Kwadrat(int x)
    {
        a=x;
    }
    float Oblicz()
    {
        return a*a;
    }
};

class Prostokat: public Ksztalt
{
    float a;
    float b;
public:
    Prostokat(int x, int y)
    {
        a=x;
        b=y;
    }
    float Oblicz()
    {
        return a*b;
    }
};

class Kolo: public Ksztalt
{
    float r;
    const float PI = 3.14;
public:
    Kolo (int x)
    {
        r=x;
    }
    float Oblicz()
    {
        return 2*PI*r;
    }
};

#endif // KSZTALT_H
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;&quot; title=&quot;pracownik.h&quot;&gt;
#define PRACOWNIK_H
#include &amp;lt;iostream&amp;gt;

using namespace std;

class Pracownik
{
public:
    virtual void Pracuj()
    {
        cout &amp;lt;&amp;lt;&quot;Przychodze do pracy i wykonuje ja.&quot;&amp;lt;&amp;lt;endl;
    }
};

class Sekretarka: public Pracownik
{
    int wiek = 21;
public:
    void Pracuj()
    {
        Pracownik x;
        x.Pracuj();
        cout&amp;lt;&amp;lt;&quot;Mam &quot;&amp;lt;&amp;lt;wiek&amp;lt;&amp;lt;&quot; lat.&quot;&amp;lt;&amp;lt;&quot;Odbieram telefony od klientow&quot;&amp;lt;&amp;lt;endl;
    }
};

class Sprzataczka: public Pracownik
{
    int wiek = 34;
public:
    void Pracuj()
    {
        Pracownik y;
        y.Pracuj();
        cout&amp;lt;&amp;lt;&quot;Mam &quot;&amp;lt;&amp;lt;wiek&amp;lt;&amp;lt;&quot; lat. Sprzatam zaklad pracy.&quot;&amp;lt;&amp;lt;endl;
    }
};


#endif // PRACOWNIK_H&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;&quot; title=&quot;main.cpp&quot;&gt;
#include &amp;lt;iostream&amp;gt;
#include &quot;Ksztalt.h&quot;
#include &quot;Pracownik.h&quot;

using namespace std;

int main()
{
  float wynik;

  Ksztalt *a = new Kwadrat(3);
  Ksztalt *b = new Prostokat(2,3);
  Ksztalt *c = new Kolo(2);

  Pracownik *d = new Sprzataczka();
  Pracownik *e = new Sekretarka();

  cout&amp;lt;&amp;lt;&quot;------------METODY CZYSTO WIRTUALNE----------------&quot;&amp;lt;&amp;lt;endl;
  wynik = a-&amp;gt;Oblicz();
  cout&amp;lt;&amp;lt;&quot;Pole kwadratu wynosi: &quot;&amp;lt;&amp;lt;wynik&amp;lt;&amp;lt;endl;
  wynik = b-&amp;gt;Oblicz();
  cout&amp;lt;&amp;lt;&quot;Pole prostokata wynosi: &quot;&amp;lt;&amp;lt;wynik&amp;lt;&amp;lt;endl;
  wynik = c-&amp;gt;Oblicz();
  cout&amp;lt;&amp;lt;&quot;Pole kola wynosi: &quot;&amp;lt;&amp;lt;wynik&amp;lt;&amp;lt;endl;
  cout&amp;lt;&amp;lt;&quot;------------METODY WIRTUALNE-----------------------&quot;&amp;lt;&amp;lt;endl;
  d-&amp;gt;Pracuj();
  e-&amp;gt;Pracuj();

  return 0;

}
&lt;/pre&gt;



&lt;p&gt;Przeanalizujcie to bo chcę wiedzieć, czy dobrze to zrozumiałam...rozumiem, ze jak klasy pochodne nie mają metod wykonujących dokładnie to samo to wykorzystujemy metody czysto wirtualne (w C# klasę abstrakcyjną) a jeśli tak to zwykłe wirtualne ?&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/333859/metoda-wirtualna-vs-czysto-wirtualna</guid>
<pubDate>Sun, 11 Mar 2018 18:14:16 +0000</pubDate>
</item>
<item>
<title>wywołanie metody wirtualnej w c++</title>
<link>https://forum.pasja-informatyki.pl/324353/wywolanie-metody-wirtualnej-w-c</link>
<description>

&lt;p&gt;Witam,&amp;nbsp;&lt;/p&gt;



&lt;p&gt;Mam do was jedno pytanie na egzaminie z c++ mam pytanie : zaznacz zdanie prawdziwe nie moge sobie z nim poradzić. Proszę o pomoc&lt;/p&gt;



&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;
	

&lt;tbody&gt;
		

&lt;tr&gt;
			

&lt;td&gt;
			

&lt;p&gt;Wywołanie metody wirtualnej jest szybsze niż wywołanie metody niewirtualnej.&lt;/p&gt;
			&lt;/td&gt;
			

&lt;td&gt;
			

&lt;p&gt;Nie ma różnicy szybkości przy wywołaniu metody wirtualnej i niewirtualnej.&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		

&lt;tr&gt;
			

&lt;td&gt;
			

&lt;p&gt;Wywołanie metody wirtualnej jest wolniejsze niż wywołanie metody niewirtualnej.&lt;/p&gt;
			&lt;/td&gt;
			

&lt;td&gt;
			

&lt;p&gt;Szybkość wywołania zależy od tego, czy wywołanie metody następuje przez typ podstawowy czy pochodny w hierarchii dziedziczenia.&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/324353/wywolanie-metody-wirtualnej-w-c</guid>
<pubDate>Mon, 05 Feb 2018 21:49:25 +0000</pubDate>
</item>
<item>
<title>Sortowanie kontenera (std::vector) złożonego z klas za pomocą funkcji sort() z biblioteki &lt;algorithm&gt;</title>
<link>https://forum.pasja-informatyki.pl/171891/sortowanie-kontenera-vector-zlozonego-klas-pomoca-funkcji-biblioteki-algorithm</link>
<description>

&lt;p style=&quot;text-align:justify&quot;&gt;Mój program dotyczący pracowników i zarobków, który wcześniej konsultowałem na forum jest na ukończeniu, jednak mam problem z posortowaniem kontenera wg &quot;wynagrodzenia&quot;. Rozumiem zamysł użytkownika ison z&amp;nbsp;tego &lt;a href=&quot;http://cpp0x.pl/forum/temat/?id=4333&quot; rel=&quot;nofollow&quot;&gt;forum&lt;/a&gt;, jednak u mnie sprawa się komplikuje, gdyż działam na klasie abstrakcyjnej Pracownik, z której dziedziczą trzy pozostałe klasy, zaś sam dostęp do składowych tych klas jest prywatny, a pole &quot;wynagrodzenie&quot; znajduje się dopiero w trzech klasach potomnych.&lt;/p&gt;



&lt;p style=&quot;text-align:justify&quot;&gt;Czy mógłbym prosić o wytłumaczenie w jaki sposób ugryźć rozwiązanie tego problemu w moim przypadku? Byłbym również wdzięczny za inne uwagi dotyczące mojego kodu, bo może wyrobiłem sobie jakieś niepotrzebne nawyki lub podchodzę do czegoś niepoprawnie...&lt;/p&gt;



&lt;p&gt;Kod zamieszczam poniżej oraz podświetlam istotne linijki:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;highlight:[28];&quot;&gt;
//===============================================
// Nazwa          : pracownik.h
//===============================================

#ifndef PRACOWNIK_H
#define PRACOWNIK_H
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;string&amp;gt;
#define PROCENT 0.35
#define PREMIA 1.5
#define STRUMIEN 128

using namespace std;

class Pracownik
{
private:
    bool zatrudnienie;
    string imie;
    string nazwisko;
    string nip;
    string pesel;
public:
    Pracownik();
    Pracownik(string im, string nzwsk, string psl, string np);
    bool sprawdzDane(string im, string nzwsk);
    bool porownajZarobki(Pracownik&amp;amp; p1,Pracownik&amp;amp; p2);
    virtual void wyswietlDane() = 0;
    virtual void obliczZarobki() = 0;
    virtual ~Pracownik() {};
};

class Staly: public Pracownik
{
private:
    double wynagrodzenie;
public:
    Staly();
    Staly(string im, string nzwsk, string psl, string np, double wngrdzn);
    void obliczZarobki() {} // istotne
    void wyswietlDane();
    ~Staly() {};
};

class Zleceniobiorca: public Pracownik
{
private:
    double stawka;
    int godziny;
    double wynagrodzenie;
public:
    Zleceniobiorca();
    Zleceniobiorca(string im, string nzwsk, string psl, string np, double stwk, int gdzn);
    void wyswietlDane();
    void obliczZarobki();
    ~Zleceniobiorca() {}
};

class Handlujacy: public Pracownik
{
private:
    double wartosc;
    int transakcje;
    double wynagrodzenie;
public:
    Handlujacy();
    Handlujacy(string im, string nzwsk, string psl, string np, double wrtsc, int trnskcj);
    void wyswietlDane();
    void obliczZarobki();
    ~Handlujacy() {}
};

void enter();
void naglowek();
void czyszczenie();

#endif
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;highlight:[129];&quot;&gt;
//===============================================
// Nazwa          : pracownik.cpp
//===============================================

#include &quot;pracownik.h&quot;

Pracownik::Pracownik()
{
    zatrudnienie = true;
    cout &amp;lt;&amp;lt; &quot;Wprowadzanie danych nowego pracownika...&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;Imie: &quot;;
    cin &amp;gt;&amp;gt; imie;
    cout &amp;lt;&amp;lt; &quot;Nazwisko: &quot;;
    cin &amp;gt;&amp;gt; nazwisko;
    cout &amp;lt;&amp;lt; &quot;PESEL: &quot;;
    cin &amp;gt;&amp;gt; pesel;
    cout &amp;lt;&amp;lt; &quot;NIP: &quot;;
    cin &amp;gt;&amp;gt; nip;
}

Pracownik::Pracownik(string im, string nzwsk, string psl, string np)
{
    zatrudnienie = true;
    imie = im;
    nazwisko = nzwsk;
    pesel = psl;
    nip = np;
}

Staly::Staly(): Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Miesieczne wynagrodzenie: &quot;;
    cin &amp;gt;&amp;gt; wynagrodzenie;
}

Staly::Staly(string im, string nzwsk, string psl, string np, double wngrdzn): Pracownik(im, nzwsk, psl, np)
{
    wynagrodzenie = wngrdzn;
}

Zleceniobiorca::Zleceniobiorca(): Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Godzinna stawka: &quot;;
    cin &amp;gt;&amp;gt; stawka;
    cout &amp;lt;&amp;lt; &quot;Przepracowane godziny: &quot;;
    cin &amp;gt;&amp;gt; godziny;
    obliczZarobki();
}

Zleceniobiorca::Zleceniobiorca(string im, string nzwsk, string psl, string np, double stwk, int gdzn): Pracownik(im, nzwsk, psl, np)
{
    stawka = stwk;
    godziny = gdzn;
    obliczZarobki();
}

Handlujacy::Handlujacy(): Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Wartosc pojedynczej transakcji: &quot;;
    cin &amp;gt;&amp;gt; wartosc;
    cout &amp;lt;&amp;lt; &quot;Ilosc transakcji: &quot;;
    cin &amp;gt;&amp;gt; transakcje;
    obliczZarobki();
}

Handlujacy::Handlujacy(string im, string nzwsk, string psl, string np, double wrtsc, int trnskcj): Pracownik(im, nzwsk, psl, np)
{
    wartosc = wrtsc;
    transakcje = trnskcj;
    obliczZarobki();
}

void Zleceniobiorca::obliczZarobki()
{
    if(godziny&amp;gt;40)
        wynagrodzenie = stawka * PREMIA;
    else
        wynagrodzenie = stawka;
}

void Handlujacy::obliczZarobki()
{
    wynagrodzenie = wartosc * transakcje * PROCENT;
}

void Pracownik::wyswietlDane()
{
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; imie;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; nazwisko;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; pesel;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; nip;
}

void Staly::wyswietlDane()
{
    Pracownik::wyswietlDane();
    cout.width(15);
    cout.setf( ios::showpoint );
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; wynagrodzenie &amp;lt;&amp;lt; endl;
}

void Zleceniobiorca::wyswietlDane()
{
    Pracownik::wyswietlDane();
    cout.width(15);
    cout.setf( ios::showpoint );
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; wynagrodzenie &amp;lt;&amp;lt; endl;
}

void Handlujacy::wyswietlDane()
{
    Pracownik::wyswietlDane();
    cout.width(15);
    cout.setf( ios::showpoint );
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; wynagrodzenie &amp;lt;&amp;lt; endl;
}

bool Pracownik::sprawdzDane(string im, string nzwsk)
{
    if(imie == im &amp;amp;&amp;amp; nazwisko == nzwsk)
        return true;
    return false;
}

bool Pracownik::porownajZarobki(Pracownik&amp;amp; p1, Pracownik&amp;amp; p2)
{
    return p1.wynagrodzenie &amp;gt; p2.wynagrodzenie;
}

void enter()
{
    getchar();
    getchar();
}
void naglowek()
{
    cout.width(5);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; &quot;Lp:&quot;;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; &quot;Imie:&quot;;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; &quot;Nazwisko:&quot;;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; &quot;PESEL:&quot;;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; &quot;NIP:&quot;;
    cout.width(15);
    cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; &quot;Wynagrodzenie:&quot; &amp;lt;&amp;lt; endl;
}

void czyszczenie()
{
    printf(&quot;\033[2J&quot;); // Czysci ekran
    printf(&quot;\033[0;0f&quot;); // Ustawia kursor w lewym, gornym rogu
}
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;highlight:[94];&quot;&gt;
//==================================================
// Nazwa          : main.cpp
//==================================================

#include &amp;lt;vector&amp;gt;
#include &amp;lt;windows.h&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &quot;pracownik.h&quot;

int main()
{
    vector &amp;lt;Pracownik*&amp;gt; kadra;
    kadra.push_back(new Staly(&quot;Piotr&quot;,&quot;Wierchowienski&quot;,&quot;63032300373&quot;,&quot;4457301037&quot;,3300));
    kadra.push_back(new Staly(&quot;Mikolaj&quot;,&quot;Stawrogin&quot;,&quot;89102905493&quot;,&quot;7260631988&quot;,4100));
    kadra.push_back(new Zleceniobiorca(&quot;Iwan&quot;,&quot;Szatow&quot;,&quot;77082213114&quot;,&quot;6825506522&quot;,2300,50));
    kadra.push_back(new Zleceniobiorca(&quot;Aleksy&quot;,&quot;Kirillow&quot;,&quot;85052403018&quot;,&quot;5913117469&quot;,2700,35));
    kadra.push_back(new Handlujacy(&quot;Sergiusz&quot;,&quot;Liputin&quot;,&quot;67052801713&quot;,&quot;4621950579&quot;,800,14));
    kadra.push_back(new Handlujacy(&quot;Ignacy&quot;,&quot;Lebiadkin&quot;,&quot;79091902931&quot;,&quot;8442924521&quot;,850,10));
    unsigned short wybor;
    do
    {
        cout &amp;lt;&amp;lt; &quot;Zarzadzanie kadra pracownicza:&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[1] --&amp;gt; Zatrudnij stalego pracownika&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[2] --&amp;gt; Zatrudnij zleceniobiorce&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[3] --&amp;gt; Zatrudnij handlujacego&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[4] --&amp;gt; Wyswietl dane pracownika&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[5] --&amp;gt; Wyswietl dane calej kadry&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[6] --&amp;gt; Wyswietl liczbe pracownikow&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[7] --&amp;gt; Zwolnij pracownika&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[8] --&amp;gt; Zwolnij cala kadre&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[0] --&amp;gt; Wyjscie&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;Twoj wybor: &quot; &amp;lt;&amp;lt; endl;
        do
        {
            cin.clear();
            cin.sync();
            cin &amp;gt;&amp;gt; wybor;
        }
        while(!cin.good());
        cout &amp;lt;&amp;lt; endl;
        switch(wybor)
        {
        case 1 :
            kadra.push_back(new Staly());
            break;
        case 2 :
            kadra.push_back(new Zleceniobiorca());
            break;
        case 3 :
            kadra.push_back(new Handlujacy());
            break;
        case 4 :
        {
            if(kadra.empty())
            {
                cout &amp;lt;&amp;lt; &quot;Brak zatrudnionych pracownikow. [ENTER]&quot; &amp;lt;&amp;lt; endl;
                enter();
                break;
            }
            cout &amp;lt;&amp;lt; &quot;Wyszukiwanie pracownika na podstawie imienia i nazwiska...&quot; &amp;lt;&amp;lt; endl;
            string szukaneImie,szukaneNazwisko;
            cout &amp;lt;&amp;lt; &quot;Imie: &quot;;
            cin &amp;gt;&amp;gt; szukaneImie;
            cout &amp;lt;&amp;lt; &quot;Nazwisko: &quot;;
            cin &amp;gt;&amp;gt; szukaneNazwisko;
            unsigned int i;
            for(i=0; i&amp;lt;kadra.size(); i++)
            {
                if(kadra[i]-&amp;gt;sprawdzDane(szukaneImie,szukaneNazwisko))
                {
                    kadra[i]-&amp;gt;wyswietlDane();
                    cout &amp;lt;&amp;lt; &quot;Aby powrocic do menu nacisnij [ENTER].&quot; &amp;lt;&amp;lt; endl;
                    enter();
                    break;
                }
            }
            if(i==kadra.size())
            {
                cout &amp;lt;&amp;lt; &quot;Brak pracownika o takim imieniu u nazwisku. [ENTER]&quot;;
                enter();
                break;
            }
        }
        break;
        case 5 :
        {
            if(kadra.empty())
            {
                cout &amp;lt;&amp;lt; &quot;Brak zatrudnionych pracownikow. [ENTER]&quot; &amp;lt;&amp;lt; endl;
                enter();
                break;
            }
            unsigned int i;
            sort(kadra.begin(),kadra.end(),porownanie);
            naglowek();
            for(i=0; i&amp;lt;kadra.size(); i++)
            {
                cout.width(5);
                cout &amp;lt;&amp;lt; left &amp;lt;&amp;lt; i;
                kadra[i]-&amp;gt;wyswietlDane();
            }
            cout &amp;lt;&amp;lt; &quot;Aby powrocic do menu nacisnij [ENTER].&quot; &amp;lt;&amp;lt; endl;
            enter();
        }
        break;
        case 6 :
            cout &amp;lt;&amp;lt; &quot;Liczba pracownikow: &quot; &amp;lt;&amp;lt; kadra.size() &amp;lt;&amp;lt;  &quot;. [ENTER]&quot; &amp;lt;&amp;lt; endl;
            enter();
            break;
        case 7 :
        {
            if(kadra.empty())
            {
                cout &amp;lt;&amp;lt; &quot;Brak zatrudnionych pracownikow. [ENTER]&quot; &amp;lt;&amp;lt; endl;
                enter();
                break;
            }
            cout &amp;lt;&amp;lt; &quot;Usuwanie pracownika o podanym indeksie&quot; &amp;lt;&amp;lt; endl;
            unsigned int szukanyIndeks;
            do
            {
                cout &amp;lt;&amp;lt; &quot;Indeks:&quot;;
                cin.clear();
                cin.sync();
                cin &amp;gt;&amp;gt; szukanyIndeks;
            }
            while(szukanyIndeks&amp;gt;kadra.size() || !cin.good());
            kadra.erase(kadra.begin()+szukanyIndeks);
            cout &amp;lt;&amp;lt; &quot;Usunieto pracownika. Aby powrocic do menu nacisnij [ENTER].&quot; &amp;lt;&amp;lt; endl;
            enter();
        }
        break;
        case 8 :
            kadra.clear();
            cout &amp;lt;&amp;lt; &quot;Cala kadra zostala zwolniona. [ENTER]&quot; &amp;lt;&amp;lt; endl;
            enter();
            break;
        }
        system(&quot;cls&quot;);
    }
    while(wybor!=0);
    return 0;
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/171891/sortowanie-kontenera-vector-zlozonego-klas-pomoca-funkcji-biblioteki-algorithm</guid>
<pubDate>Mon, 22 Aug 2016 22:02:11 +0000</pubDate>
</item>
<item>
<title>Przeciążanie metod wirtualnych, a kontener tablicy (std::vector)</title>
<link>https://forum.pasja-informatyki.pl/170579/przeciazanie-metod-wirtualnych-a-kontener-tablicy-std-vector</link>
<description>

&lt;p&gt;Bardzo proszę o wyjaśnienie błędu, co robię niepoprawnie. Piszę program w C++, który wykorzystuje zagadnienia poliformizmu, funkcji wirtualnych oraz kontenerów na temat kadry pracowniczej. Kompilował się on bez zarzutów dopóki nie zacząłem pisać funkcji wirtualnych...&lt;/p&gt;



&lt;p&gt;Komunikat od kompilatora:&lt;/p&gt;



&lt;pre class=&quot;brush:as3;&quot;&gt;
||=== Build: Debug in ehh (compiler: GNU GCC Compiler) ===|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\stl_vector.h||In instantiation of 'class std::vector&amp;lt;Pracownik&amp;gt;':|
D:\00 Kody\ehh\main.cpp|13|required from here|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\stl_vector.h|713|error: invalid abstract parameter type 'Pracownik'|
D:\00 Kody\ehh\pracownik.h|17|note:   because the following virtual functions are pure within 'Pracownik':|
D:\00 Kody\ehh\pracownik.h|30|note:     virtual void Pracownik::obliczZarobki()|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\vector.tcc||In instantiation of 'void std::vector&amp;lt;_Tp, _Alloc&amp;gt;::_M_insert_aux(std::vector&amp;lt;_Tp, _Alloc&amp;gt;::iterator, const _Tp&amp;amp;) [with _Tp = Pracownik; _Alloc = std::allocator&amp;lt;Pracownik&amp;gt;; std::vector&amp;lt;_Tp, _Alloc&amp;gt;::iterator = __gnu_cxx::__normal_iterator&amp;lt;Pracownik*, std::vector&amp;lt;Pracownik&amp;gt; &amp;gt;; typename std::_Vector_base&amp;lt;_Tp, _Alloc&amp;gt;::pointer = Pracownik*]':|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\stl_vector.h|925|required from 'void std::vector&amp;lt;_Tp, _Alloc&amp;gt;::push_back(const value_type&amp;amp;) [with _Tp = Pracownik; _Alloc = std::allocator&amp;lt;Pracownik&amp;gt;; std::vector&amp;lt;_Tp, _Alloc&amp;gt;::value_type = Pracownik]'|
D:\00 Kody\ehh\main.cpp|14|required from here|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\vector.tcc|337|error: cannot allocate an object of abstract type 'Pracownik'|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\vector.tcc|337|error: cannot declare variable '__x_copy' to be of abstract type 'Pracownik'|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\ext\new_allocator.h||In instantiation of 'void __gnu_cxx::new_allocator&amp;lt;_Tp&amp;gt;::construct(__gnu_cxx::new_allocator&amp;lt;_Tp&amp;gt;::pointer, const _Tp&amp;amp;) [with _Tp = Pracownik; __gnu_cxx::new_allocator&amp;lt;_Tp&amp;gt;::pointer = Pracownik*]':|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\ext\alloc_traits.h|189|required from 'static void __gnu_cxx::__alloc_traits&amp;lt;_Alloc&amp;gt;::construct(_Alloc&amp;amp;, __gnu_cxx::__alloc_traits&amp;lt;_Alloc&amp;gt;::pointer, const _Tp&amp;amp;) [with _Tp = Pracownik; _Alloc = std::allocator&amp;lt;Pracownik&amp;gt;; __gnu_cxx::__alloc_traits&amp;lt;_Alloc&amp;gt;::pointer = Pracownik*]'|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\bits\stl_vector.h|918|required from 'void std::vector&amp;lt;_Tp, _Alloc&amp;gt;::push_back(const value_type&amp;amp;) [with _Tp = Pracownik; _Alloc = std::allocator&amp;lt;Pracownik&amp;gt;; std::vector&amp;lt;_Tp, _Alloc&amp;gt;::value_type = Pracownik]'|
D:\00 Kody\ehh\main.cpp|14|required from here|
c:\mingw\lib\gcc\mingw32\4.9.3\include\c++\ext\new_allocator.h|130|error: invalid new-expression of abstract class type 'Pracownik'|
||=== Build failed: 4 error(s), 9 warning(s) (0 minute(s), 0 second(s)) ===|&lt;/pre&gt;



&lt;p&gt;Natomiast kod udostępniłem poniżej:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;highlight:[5];&quot;&gt;
//=======================================
// Nazwa  : pracownik.h
//=======================================

#ifndef PRACOWNIK_H
#define PRACOWNIK_H
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;string&amp;gt;
#define PROCENT 1.5

using namespace std;

class Pracownik
{
private:
    bool zatrudnienie;
    string imie;
    string nazwisko;
    string pesel;
    string nip;
public:
    Pracownik();
    Pracownik(string im, string nzwsk, string psl, string np);
    //void zmianaZatrudnienia(Pracownik prcwnk);
    //virtual void wyswietlDane() = 0;
    virtual void obliczZarobki() = 0;
    virtual ~Pracownik() {};
    // jest to jednoczesnie implementacja
    // zastanowić się gdyby nie było destruktora
};

class Staly: public Pracownik
{
private:
    double wynagrodzenie;
public:
    Staly();
    Staly(string im, string nzwsk, string psl, string np, double wngrdzn);
    void obliczZarobki() {} //musi być kurcze
    //void wyswietlDane(); // const
    ~Staly() {};
};

class Zleceniobiorca: public Pracownik
{
private:
    double stawka;
    int godziny;
    double wynagrodzenie;
public:
    Zleceniobiorca();
    Zleceniobiorca(string im, string nzwsk, string psl, string np, double stwk, int gdzn);
    //void wyswietlDane(); // const
    void obliczZarobki();
    ~Zleceniobiorca() {}
};

class Handlujacy: public Pracownik
{
private:
    double wartosc;
    int transakcje;
    double wynagrodzenie;
public:
    Handlujacy();
    Handlujacy(string im, string nzwsk, string psl, string np, double wrtsc, int trnskcj);
    //void wyswietlDane(); // const
    void obliczZarobki();
    ~Handlujacy() {}
};

void czyszczenie();
#endif
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;highlight:[5];&quot;&gt;
//=======================================
// Nazwa  : pracownik.cpp
//=======================================

#include &quot;pracownik.h&quot;

Pracownik::Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Wprowadzanie danych nowego pracownika...&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; &quot;Imie: &quot;;
    cin &amp;gt;&amp;gt; imie;
    cout &amp;lt;&amp;lt; &quot;Nazwisko: &quot;;
    cin &amp;gt;&amp;gt; nazwisko;
    cout &amp;lt;&amp;lt; &quot;Pesel: &quot;;
    cin &amp;gt;&amp;gt; pesel;
    cout &amp;lt;&amp;lt; &quot;Numer identyfikacji podatkowej: &quot;;
    cin &amp;gt;&amp;gt; nip;
}

Pracownik::Pracownik(string im, string nzwsk, string psl, string np)
{
    zatrudnienie = true;
    imie = im;
    nazwisko = nzwsk;
    pesel = psl;
    nip = np;
}

Staly::Staly(): Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Miesieczne wynagrodzenie: &quot;;
    cin &amp;gt;&amp;gt; wynagrodzenie;
}

Staly::Staly(string im, string nzwsk, string psl, string np, double wngrdzn): Pracownik(im, nzwsk, psl, np)
{
    wynagrodzenie = wngrdzn;
}

Zleceniobiorca::Zleceniobiorca(): Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Godzinna stawka: &quot;;
    cin &amp;gt;&amp;gt; stawka;
    cout &amp;lt;&amp;lt; &quot;Przepracowane godziny: &quot;;
    cin &amp;gt;&amp;gt; godziny;
}

Zleceniobiorca::Zleceniobiorca(string im, string nzwsk, string psl, string np, double stwk, int gdzn): Pracownik(im, nzwsk, psl, np)
{
    stawka = stwk;
    godziny = gdzn;
}

Handlujacy::Handlujacy(): Pracownik()
{
    cout &amp;lt;&amp;lt; &quot;Wartosc pojedynczej transakcji: &quot;;
    cin &amp;gt;&amp;gt; wartosc;
    cout &amp;lt;&amp;lt; &quot;Ilosc transakcji: &quot;;
    cin &amp;gt;&amp;gt; transakcje;
}

Handlujacy::Handlujacy(string im, string nzwsk, string psl, string np, double wrtsc, int trnskcj): Pracownik(im, nzwsk, psl, np)
{
    wartosc = wrtsc;
    transakcje = trnskcj;
}

void Zleceniobiorca::obliczZarobki()
{

}

void Handlujacy::obliczZarobki()
{

}

void czyszczenie()
{
    printf(&quot;\033[2J&quot;); // Czyści ekran
    printf(&quot;\033[0;0f&quot;); // Ustawia kursor w lewym, górnym rogu
}
&lt;/pre&gt;



&lt;pre class=&quot;brush:cpp;highlight:[5];&quot;&gt;
//=======================================
// Nazwa  : main.cpp
//=======================================

#include &amp;lt;vector&amp;gt;
#include &quot;pracownik.h&quot;

int main()
{
    vector &amp;lt;Pracownik&amp;gt; baza;
    baza.push_back(Staly(&quot;Piotr&quot;,&quot;Wierchowieński&quot;,&quot;63032300373&quot;,&quot;4457301037&quot;,3300));
    baza.push_back(Staly(&quot;Mikołaj&quot;,&quot;Stawrogin&quot;,&quot;89102905493&quot;,&quot;7260631988&quot;,4100));
    baza.push_back(Zleceniobiorca(&quot;Iwan&quot;,&quot;Szatow&quot;,&quot;77082213114&quot;,&quot;6825506522&quot;,2300,40));
    baza.push_back(Zleceniobiorca(&quot;Aleksy&quot;,&quot;Kiriłłow&quot;,&quot;85052403018&quot;,&quot;5913117469&quot;,2700,25));
    baza.push_back(Handlujacy(&quot;Sergiusz&quot;,&quot;Liputin&quot;,&quot;67052801713&quot;,&quot;4621950579&quot;,560,14));
    baza.push_back(Handlujacy(&quot;Ignacy&quot;,&quot;Lebiadkin&quot;,&quot;79091902931&quot;,&quot;8442924521&quot;,770,10));
    int wybor;
    do
    {
        cout &amp;lt;&amp;lt; &quot;Edycja kadry pracowniczej:&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[1] --&amp;gt; Dodaj stalego pracownika na koncu danych&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[2] --&amp;gt; Dodaj zleceniobiorce na koncu danych&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[3] --&amp;gt; Dodaj handulajcego na koncu danych&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[4] --&amp;gt; Zmien stan zatrudnienia pracownika&quot; &amp;lt;&amp;lt; endl; // zastanowi  si
        cout &amp;lt;&amp;lt; &quot;[5] --&amp;gt; Usun pracownika z kadry&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[6] --&amp;gt; Usun cala kadre&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;[0] --&amp;gt; Wyjscie&quot; &amp;lt;&amp;lt; endl;
        cout &amp;lt;&amp;lt; &quot;Twoj wybor: &quot; &amp;lt;&amp;lt; endl;
        do
        {
            cin.clear();
            cin.sync();
            cin &amp;gt;&amp;gt; wybor;
        }
        while(!cin.good());
        switch(wybor)
        {
        case 1 :
            baza.push_back(Staly());
            break;
        case 2 :
            baza.push_back(Zleceniobiorca());
            break;
        case 3 :
            baza.push_back(Handlujacy());
            break;
        case 4 :
            break;
        case 5 :
            break;
        case 6 :
            break;
        }
    }
    while(wybor!=0);
    return 0;
}
&lt;/pre&gt;



&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/170579/przeciazanie-metod-wirtualnych-a-kontener-tablicy-std-vector</guid>
<pubDate>Fri, 19 Aug 2016 17:35:19 +0000</pubDate>
</item>
<item>
<title>Fukncje wirtualne - Polimorfizm -  w C++ Builderze (przykład)</title>
<link>https://forum.pasja-informatyki.pl/137982/fukncje-wirtualne-polimorfizm-w-c-builderze-przyklad</link>
<description>

&lt;p&gt;Witam,&lt;/p&gt;



&lt;p&gt;Proszę o&amp;nbsp; przykład stworzenia klas 1 abstrakcyjnej i 3 które z niej dziedziczą, &lt;strong&gt;coś na zasadzie tego przykładu z konsoli class Ksztalt i dziedziczne klasy: Kolo, Kwadrat, Trojkat&lt;/strong&gt;&amp;nbsp;(tyle że &lt;strong&gt;w C++ Builderze&lt;/strong&gt;), ktore wstawiaja powiedzny obrazek w jedno pole Image w&amp;nbsp; zaleznosci od tego jaka forme wybierzemy: kolo, kwadrat czy trójkąt. I przyklad wywolania tej funcji wstaw() z klasy&amp;nbsp; np po nacisnieciu przycisku.&lt;/p&gt;



&lt;p&gt;pozdrawiam.&lt;/p&gt;</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/137982/fukncje-wirtualne-polimorfizm-w-c-builderze-przyklad</guid>
<pubDate>Thu, 05 May 2016 19:14:30 +0000</pubDate>
</item>
<item>
<title>Metoda wirtualna zwracająca różne typy</title>
<link>https://forum.pasja-informatyki.pl/17450/metoda-wirtualna-zwracajaca-rozne-typy</link>
<description>Witajcie Koledzy!&lt;br /&gt;
&lt;br /&gt;
Mam taki oto problem. Mam dwie klasy bazowe Line i Circle a z każdej dziedziczą po 4 klasy pochodne. Tworzę listę składającą się ze wskaźników na klasy bazowe i następny element listy. W zależności od wyborów użytkownika w danym elemencie listy tworzy się odpowiednio obiekt klasy pochodnej. Chce teraz wydrukować dane, które zawierają obiekty. I tu się rodzi problem. Potrzebuje wyciągnąć atrybuty private z każdej klasy pochodnej, czyli strukturę. W każdej klasie jest inna. &lt;br /&gt;
&lt;br /&gt;
I tu się rodzi moje pytanie. Jak to zrobić? Może utworzyć metody wirtualne, ale tu za każdym razem będzie zwracany inny typ. Może utworzyć metodę typu void, która będzie modyfikowała dane w kontenerze i dopiero z tego kontenera wyrzucać dane na ekran.&lt;br /&gt;
&lt;br /&gt;
Proszę o podpowiedzi i dzięki! :)</description>
<category>C i C++</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/17450/metoda-wirtualna-zwracajaca-rozne-typy</guid>
<pubDate>Sun, 03 May 2015 21:20:54 +0000</pubDate>
</item>
</channel>
</rss>