Skocz do zawartości
  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

MatYs

[C++] Wirtualność metod nie potrzebna?

Promowane odpowiedzi

MatYs    252

Witam, mam problem z programem C++. Działa mi tak jakbym chciał, ale nie powinien. Metody w klasie Osoba powinny być wirtualne, ponieważ w dziedziczonych klasach się powielają. Dlaczego więc to działa?

 

Załączam program.

#include <iostream>
using namespace std;
class Osoba {
    protected:
        int wiek;
        int pesel;
    public:
        Osoba(int, int);
        ~Osoba();
        void wypisz() const;
        void zmien();
        void ustaw_osoba(int, int);
};
class Pacjent : public Osoba {
    protected:
        int dni_ch;
        string choroba;
    public:
        Pacjent(int, int, int, string);
        ~Pacjent();
        void wypisz() const;
        void zmien();
        void ustaw_osoba(int, int, int, string);
};
class Lekarz : public Osoba {
    protected:
        int staz;
        string nazwisko;
    public:
        Lekarz(int, int, int, string);
        ~Lekarz();
        void wypisz() const;
        void zmien();
        void ustaw_osoba(int, int, int, string);
};
int main()
{
    Osoba M(21, 21993445);
    M.wypisz();
    cout << "* * * * * *" << endl;
    Lekarz K(21, 213123, 9, "Sielewka");
    K.wypisz();
    K.zmien();
    K.wypisz();
    cout << "* --- * --- * --- *" << endl;
    /* dynamicznie */
    Pacjent *P = new Pacjent(12, 45, 122, "Nazwa choroby");
    P->wypisz();
    P->zmien();
    P->wypisz();
    return 0;
}
Osoba::Osoba(int x, int y)
: wiek(x), pesel(y) {
}
Osoba::~Osoba() {
}
void Osoba::wypisz() const {
    cout << "Wiek: " << wiek << ", pesel: " << pesel << endl;
}
void Osoba::zmien() {
    int a, b;
    cout << "Podaj wiek: ";
    cin >> a;
    cout << "Podaj pesel: ";
    cin >> b;
    ustaw_osoba(a, b);
}
void Osoba::ustaw_osoba(int a, int b) {
    wiek = a;
    pesel = b;
}
Lekarz::Lekarz(int x, int y, int s, string n)
: Osoba(x, y), staz(s), nazwisko(n) {
}
Lekarz::~Lekarz() {
}
void Lekarz::wypisz() const {
    cout << "Wiek: " << wiek << ", pesel: " << pesel << endl;
    cout << "Staz: " << staz << " lat, nazwisko: " << nazwisko << endl;
}
void Lekarz::ustaw_osoba(int a, int b, int s, string n) {
    wiek = a;
    pesel = b;
    staz = s;
    nazwisko = n;
}
void Lekarz::zmien() {
    int a, b, c;
    string d;
    cout << "Podaj wiek: ";
    cin >> a;
    cout << "Podaj pesel: ";
    cin >> b;
    cout << "Podaj staz: ";
    cin >> c;
    cout << "Podaj nazwisko: ";
    cin >> d;
    ustaw_osoba(a, b, c, d);
}
Pacjent::Pacjent(int x, int y, int z, string ch)
: Osoba(x, y), dni_ch(z), choroba(ch) {
}
Pacjent::~Pacjent() {
}
void Pacjent::wypisz() const {
    cout << "Wiek: " << wiek << ", pesel: " << pesel << endl;
    cout << "Dni choroby: " << dni_ch << ", choroba: " << choroba << endl;
}
void Pacjent::ustaw_osoba(int a, int b, int z, string ch) {
    wiek = a;
    pesel = b;
    dni_ch = z;
    choroba = ch;
}
void Pacjent::zmien() {
    int a, b, c;
    string d;
    cout << "Podaj wiek: ";
    cin >> a;
    cout << "Podaj pesel: ";
    cin >> b;
    cout << "Podaj dni choroby: ";
    cin >> c;
    cout << "Podaj nazwe choroby: ";
    cin >> d;
    ustaw_osoba(a, b, c, d);
}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
Gość   
Gość

zacznijmy od tego, że twoje metody wcale nie są wirtualne to raz, a dwa przydały by sie przedrostek Virtual co nie ?

Nie wiem też po co ci w klasie "matce" destruktor i konstruktor ?

Skoro chciałeś ukazać dobroć obiektowości, polimorfizmu to czemu w/w metody nie są czysto wirtualne ?

 

A poza tym widzę, że program żyje własnym życiem :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.


×