#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include <typeinfo>
class samochod {
protected:
double cena;
char rodzaj_silnika[20];
public:
static int x;
virtual void wyswietl_atrybuty() {
printf("\n");
printf("Cena wynosi:%g\n",cena);
printf("Rodzaj silnika:%s.\n",rodzaj_silnika);
};
samochod *nast;
samochod::samochod(){
char rdz[20]="brak";
cena=0;
strcpy(rodzaj_silnika, rdz);
nast=NULL;
x=++x;
}
samochod::samochod(double a, char b[20]){
cena=a;
strcpy(rodzaj_silnika, b);
nast=NULL;
x=++x;
}
virtual~samochod(){
if(nast!=NULL){
x=--x;
}
}
};
class ciezarowy;
class osobowy: public samochod{
protected:
double poj_bagaznika;
int liczba_drzwi;
char typ_sylwetki[20];
public:
friend ciezarowy;
void ustal_atrybuty() {
double cn;
char rodzaj[20];
double poj;
int liczba;
char typ[20];
printf("Cena=");
scanf("%lf",&cn);
printf("Rodzaj silnika=");
scanf("%s",&rodzaj);
printf("Pojemnosc bagaznika=");
scanf("%lf",&poj);
printf("Liczba drzwi=");
scanf("%d",&liczba);
printf("Typ sylwetki=");
scanf("%s",&typ);
cena=cn;
strcpy(rodzaj_silnika, rodzaj);
poj_bagaznika=poj;
liczba_drzwi=liczba;
strcpy(typ_sylwetki, typ);
};
void wyswietl_atrybuty() {
printf("\n");
printf("Cena wynosi:%g\n",cena);
printf("Rodzaj silnika:%s.\n",rodzaj_silnika);
printf("Pojemnosc bagaznika:%g\n",poj_bagaznika);
printf("Liczba drzwi:%d\n",liczba_drzwi);
printf("Typ sylwetki:%s\n",typ_sylwetki);
};
osobowy operator+(osobowy drugi){
osobowy suma;
suma.cena=cena+drugi.cena;
suma.poj_bagaznika=poj_bagaznika+drugi.poj_bagaznika;
suma.liczba_drzwi=liczba_drzwi+drugi.liczba_drzwi;
return suma;
};
osobowy& operator+=(const osobowy& rv){
cena+=rv.cena;
poj_bagaznika+=rv.poj_bagaznika;
liczba_drzwi+=rv.liczba_drzwi;
return *this;
};
const osobowy operator=(const osobowy& rv){
cena=rv.cena;
poj_bagaznika=rv.poj_bagaznika;
liczba_drzwi=rv.liczba_drzwi;
return *this;
};
osobowy::osobowy(){
samochod::samochod();
char tp[20]="brak";
poj_bagaznika=0;
liczba_drzwi=3;
strcpy(typ_sylwetki, tp);
nast=NULL;
}
osobowy(double a, char b[20], double c, int d, char e[20]):samochod(a,b){
poj_bagaznika=c;
liczba_drzwi=d;
strcpy(typ_sylwetki, e);
wyswietl_atrybuty();
nast=NULL;
}
osobowy(const ciezarowy& rv);
~osobowy(){
if(nast!=NULL){
x=--x;
printf("Typ obiektu:%s\n","osobowy");
printf("Pole statyczne: %d\n",x);
delete nast;
}
}
};
class ciezarowy: public samochod{
protected:
double max_ladownosc;
int liczba_kol;
public:
friend osobowy;
void ustal_atrybuty() {
double cn;
char rodzaj[20];
double ladownosc;
int kola;
printf("Cena=");
scanf("%lf",&cn);
printf("Rodzaj silnika=");
scanf("%s",&rodzaj);
printf("Maksymalna ladownosc=");
scanf("%lf",&ladownosc);
printf("Liczba kol=");
scanf("%d",&kola);
cena=cn;
strcpy(rodzaj_silnika, rodzaj);
max_ladownosc=ladownosc;
liczba_kol=kola;
};
void wyswietl_atrybuty() {
printf("\n");
printf("Cena wynosi:%g\n",cena);
printf("Rodzaj silnika:%s.\n",rodzaj_silnika);
printf("Maksymalna ladownosc:%g.\n",max_ladownosc);
printf("Liczba kol:%d.\n",liczba_kol);
}
ciezarowy operator+(ciezarowy drugi){
ciezarowy suma;
suma.cena=cena+drugi.cena;
suma.max_ladownosc=max_ladownosc+drugi.max_ladownosc;
suma.liczba_kol=liczba_kol+drugi.liczba_kol;
return suma;
};
const ciezarowy operator=(const ciezarowy& rv){
cena=rv.cena;
max_ladownosc=rv.max_ladownosc;
liczba_kol=rv.liczba_kol;
return *this;
};
const ciezarowy operator+=(const ciezarowy& rv){
cena+=rv.cena;
max_ladownosc+=rv.max_ladownosc;
liczba_kol+=rv.liczba_kol;
return *this;
};
ciezarowy::ciezarowy(){
samochod::samochod();
max_ladownosc=0;
liczba_kol=4;
nast=NULL;
}
ciezarowy(double a, char b[20], double c, int d):samochod(a,b){
max_ladownosc=c;
liczba_kol=d;
wyswietl_atrybuty();
nast=NULL;
}
ciezarowy(const osobowy& rv){
cena=rv.cena;
max_ladownosc=rv.poj_bagaznika;
liczba_kol=rv.liczba_drzwi;
}
~ciezarowy(){
if(nast!=NULL){
x=--x;
printf("Typ obiektu:%s\n","ciezarowy");
printf("Pole statyczne: %d\n",x);
delete nast;
}
}
};
int samochod::x = 9;
samochod *glowa=NULL;
samochod *wsk=NULL;
void fun_rozpoznajaca(samochod **wskaznik){
if (typeid(*wsk) == typeid(osobowy))
printf("Kolejny element jest typu osobowy.\n");
else if (typeid(*wsk) == typeid(ciezarowy))
printf("Kolejny element jest typu ciezarowy.\n");
}
osobowy::osobowy(const ciezarowy& rv){
cena=rv.cena;
poj_bagaznika=rv.max_ladownosc;
liczba_drzwi=rv.liczba_kol;
}
int main() {
printf("A1:\n");
osobowy A1(132.0,"diesel",2.0,3,"hatchback");
printf("A2:\n");
osobowy A2(234.8,"benzyna",2.3,3,"combi");
printf("A3:\n");
osobowy A3(234.8,"benzyna",2.3,3,"combi");
printf("B1:\n");
ciezarowy B1(201.9, "benzyna", 34.7, 6);
printf("B2:\n");
ciezarowy B2(272.4, "ON", 45.7, 8);
printf("B3:\n");
ciezarowy B3(279.1, "ON", 60.7, 8);
ciezarowy B4(A3);
B4.wyswietl_atrybuty();
osobowy A4(B3);
A4.wyswietl_atrybuty();
A2=A1+=B1;
A2.wyswietl_atrybuty();
B1=B2+=A1;
B1.wyswietl_atrybuty();
B2=B1=A1+A2;
B2.wyswietl_atrybuty();
A1=B1+A1+A2;
A1.wyswietl_atrybuty();
A3=A2+A1;
A3.wyswietl_atrybuty();
B3=A3;
B3.wyswietl_atrybuty();
B2=A3+B1+A1;
B2.wyswietl_atrybuty();
getchar();
getchar();
exit(0);
return 0;
};