Diskuze: Polymorphism v C++

C++ C a C++ Polymorphism v C++

Avatar
davaj
Člen
Avatar
davaj:

Zdravim,
predelavam jednu praci z C# do C++ a narazil jsem na problem v Polymorphismu.
Chybna metoda je virtual void Vyber(int castka); V CodeBlocks mi to zkompiluje bez chyby, ale program prestane fungovat pri vyberu z UrokovehoUctu. V C# to mam vyresene spravne pres virtual a override v odvozene tridy. Jenze v C++ se mi to nedari spravne prepsat. Diky za rady.

main.cpp

#include <iostream>
#include "BankovniUcet.h"
#include "UrokovyUcet.h"

using namespace std;

int main()
{
    BankovniUcet *uzivatel = new BankovniUcet(200);
    uzivatel->Prevod();
    UrokovyUcet *uzivatel2 = new UrokovyUcet(200);
    uzivatel2->Prevod();
    return 0;
}

BankovniUcet.h

#ifndef BANKOVNIUCET_H
#define BANKOVNIUCET_H

class BankovniUcet
{
    private:
    public:
        int castka;
        int stavUctu;
        BankovniUcet(int vklad);
        void Vklad(int castka);
        virtual void Vyber(int castka);
        void Prevod();
    protected:
    private:
};

#endif // BANKOVNIUCET_H

BankovniUcet.cpp

#include "BankovniUcet.h"
#include <iostream>
using namespace std;

BankovniUcet::BankovniUcet(int vklad)
{
    stavUctu = vklad;
    cout << "Byl zalozen ucet s pocatecnim stavem " << stavUctu << " KC." << endl;
}
void BankovniUcet::Vklad(int castka)
{
    if (castka > 0)
        stavUctu = stavUctu + castka;
    else
        cout << "Chyba ! Zaporna hodnota." << endl;
}
void BankovniUcet::Vyber(int castka)
{
    //castka nesmi byt nulova nebo zaporna
    if (castka > 0)
    {
        //vybrana castka nesmi byt vetsi nez castka co je aktualne na ucte
        if (stavUctu >= castka)
            stavUctu -= castka;
        else
           cout << "Litujeme. Na vasem uctu je pouze " << stavUctu << " Kc" << endl;
    }
    else
        cout << "Chyba ! Zaporna hodnota." << endl;

}
void BankovniUcet::Prevod()
{
    bool ukoncit = false;
    do
    {
        cout << "1) vlozit penize\n2) vybrat penize \n3) ukoncit" << endl;
        cout << "Stav uctu je " << stavUctu << endl;
        int volba;
        cin >> volba;
        if (volba == 1)
        {
            cout << "Stav uctu "<< stavUctu << "\nZadejte castku, kterou chcete vlozit: " << endl;
            cin >> castka;
            Vklad(castka);
        }
        else if (volba == 2)
        {
            cout << "Stav uctu "<< stavUctu << "\nZadejte castku, kterou chcete vybrat: " << stavUctu << endl;
            cin >> castka;
            Vyber(castka);
        }
        else if (volba == 3)
            ukoncit = true;
        else
            cout << "Zadal jsi spatnou volbu !"  << endl;
        cout << "##############################" << endl;
    } while (ukoncit == false);
}

UrokovyUcet.h

#ifndef UROKOVYUCET_H
#define UROKOVYUCET_H
#include "BankovniUcet.h"

class UrokovyUcet : public BankovniUcet
{
    private:
    public:
        int poplatek;
        UrokovyUcet(int vklad);
        void Vyber(int castka);
    protected:
    private:
};

#endif // UROKOVYUCET_H

UrokovyUcet.cpp

#include "UrokovyUcet.h"
#include <iostream>
using namespace std;

UrokovyUcet::UrokovyUcet(int vklad):BankovniUcet(vklad)
{
    poplatek = 3;
    cout << "Uroceny Ucet" << endl;
}

void UrokovyUcet::Vyber(int castka)
{
    if(stavUctu > 3)
    {
        castka += poplatek;
        Vyber(castka);
    }
    else
        cout << "Chyba !" << endl;
}
Editováno 7.1.2015 0:02
 
Odpovědět 6.1.2015 23:57
Avatar
davaj
Člen
Avatar
davaj:

Program. Chyba bude v metode void Vyber(int castka); v UrokovyUcet.cpp,U­rokovyUcet.h

ale nevim jaka.

Editováno 7.1.2015 0:06
 
Nahoru Odpovědět 7.1.2015 0:03
Avatar
Odpovídá na davaj
Lukáš Hruda (Luckin):

Funkci UrokovyUcet::Vyber voláš rekurzivně, program se zacyklí a spadne z důvodu přetečení zásobníku.

 
Nahoru Odpovědět  +2 7.1.2015 0:05
Avatar
davaj
Člen
Avatar
davaj:

Spravne to ma byt jak ? Tohle mi moc nereklo.

 
Nahoru Odpovědět 7.1.2015 0:09
Avatar
Odpovídá na davaj
Lukáš Hruda (Luckin):

To ti mělo říct, že ve funkci Vyber voláš znovu tu samou funkci Vyber.
Pokud vím, tak tohle funguje stejně i v C#. Pokud uvnitř třídy voláš metodu použitím samotného názvu, pak se volá metoda té dané třídy. Tedy zde, pokud zavoláš metodu Vyber ve třídě UrokovyUcet, pak voláš metodu Vyber třídy UrokovyUcet. Jelikož jí voláš taktéž z metody Vyber, nastane rekurze. Stačilo by si vygooglit, jak v C++ volat metodu předka.
Musíš použít operátor :: ve spojitosti s třídou, z které chceš metodu volat. V tomto případě tedy místo metody Vyber, musíš zavolat BankovniUcet::Vy­ber.

Editováno 7.1.2015 0:23
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 7.1.2015 0:22
Avatar
davaj
Člen
Avatar
davaj:

Jo aha. Diky moc. :)

 
Nahoru Odpovědět 7.1.2015 0:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.