borisdexter

Objektno polimorfizam

Jan 23rd, 2020
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.09 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3. // virtuelni funkcii se tie shto sakame sekoj shto gi nasleduva da gi preoptovari
  4. // obicni virtual imaat default vrednost
  5. // pure virtual =0 nemaat default vrednost i mora da se preoptovarat
  6. /*
  7. class Abstract{
  8. public:
  9. // pure virtual
  10. virtual bool daliTone()=0;
  11. // virtual
  12. virtual void print(){
  13. cout<<"Abstract class print"<<endl;
  14. }
  15. //
  16. virtual char tip()=0;
  17.  
  18. };
  19. class Brod{
  20. protected:
  21. int kapacitet;
  22. char *ime;
  23. float tezina;
  24. public:
  25. Brod(){
  26. this->ime=new char[0];
  27. }
  28. Brod(char *ime,int kapacitet,float tezina){
  29. //delete []this->ime;
  30. this->ime=new char[strlen(ime)+1];
  31. strcpy(this->ime,ime);
  32. this->kapacitet=kapacitet;
  33. this->tezina=tezina;
  34. }
  35. ~Brod(){
  36. delete []ime;
  37. }
  38. };
  39.  
  40. class Tanker:public Brod, public Abstract{
  41. private:
  42. bool legalno;
  43. public:
  44. Tanker(){}
  45. Tanker(char *ime,int kapacitet, float tezina, bool legalno):Brod(ime,kapacitet,tezina){
  46. this->legalno=legalno;
  47. }
  48. // preoptovaruvame cisto virtuelna funkcija
  49. bool daliTone(){
  50. if(legalno){
  51. return true;
  52. }else{
  53. return false;
  54. }
  55. }
  56.  
  57. void print(){
  58. cout<<ime<<" "<<kapacitet<<" "<<tezina<<" "<<legalno<<endl;
  59. }
  60.  
  61. char tip(){
  62. return 't';
  63. }
  64. ~Tanker(){}
  65. };
  66.  
  67. class Kruzer:public Brod, public Abstract{
  68. private:
  69. bool bazen;
  70. public:
  71. Kruzer(){}
  72. Kruzer(char *ime,int kapacitet, float tezina, bool bazen):Brod(ime,kapacitet,tezina){
  73. this->bazen=bazen;
  74. }
  75. //
  76. bool daliTone(){
  77. return false;
  78. }
  79.  
  80. void print(){
  81. cout<<ime<<" "<<kapacitet<<" "<<tezina<<" "<<bazen<<endl;
  82. }
  83.  
  84. char tip(){
  85. return 'k';
  86. }
  87. ~Kruzer(){}
  88. };
  89.  
  90. void printBrodovi(Abstract **niza,int n){
  91. for(int i=0;i<n;i++){
  92. niza[i]->print();
  93. }
  94. }
  95.  
  96. void kruzerVstanker(Abstract **niza,int n){
  97. int brojKruzeri=0;
  98. int brojTankeri=0;
  99. for(int i=0;i<n;i++){
  100. Kruzer *pK=dynamic_cast<Kruzer*>(niza[i]);
  101. if(pK!=0){
  102. brojKruzeri++;
  103. }
  104. Tanker *pT=dynamic_cast<Tanker*>(niza[i]);
  105. if(pT!=0){
  106. brojTankeri++;
  107. }
  108.  
  109. if(niza[i]->tip()=='t'){
  110. brojTankeri++;
  111. }else{
  112. brojKruzeri++;
  113. }
  114. }
  115. cout<<"Kruzer "<<brojKruzeri<<":"<<brojTankeri<<" Tankeri"<<endl;
  116. }
  117. int main(){
  118. Abstract **niza=new Abstract*[2];
  119. niza[0]=new Tanker("Petar",100,70,false);
  120. niza[1]=new Kruzer("David",101,80,true);
  121. kruzerVstanker(niza,2);
  122. return 0;
  123. }
  124. */
  125.  
  126.  
  127.  
  128. class Zivotno{
  129. protected:
  130. char boja[15];
  131. int godini;
  132. public:
  133. Zivotno(){
  134. //cout<<"Default constructor zivotno"<<endl;
  135. }
  136. Zivotno(char boja[],int godini){
  137. cout<<"Parameter constructor zivotno"<<endl;
  138. strcpy(this->boja,boja);
  139. this->godini=godini;
  140. }
  141. // virtuelna funkcija
  142. virtual void print(){
  143. cout<<"Zivotno: "<<boja<<" "<<godini<<endl;
  144. }
  145. // cisto virtuelna funkcija
  146. virtual float damage()=0;
  147. // cisto virtuelna funkcija
  148. virtual char tip()=0;
  149.  
  150. virtual ~Zivotno(){
  151. cout<<"Default destructor zivotno"<<endl;
  152. }
  153. };
  154. class Kuce:public Zivotno{
  155. private:
  156. char rasa[15];
  157. public:
  158. Kuce(){
  159. //cout<<"Default constructor Kuce"<<endl;
  160. }
  161. Kuce(char boja[],int godini,char rasa[]):Zivotno(boja,godini){
  162. //cout<<"Parameter constructor Kuce"<<endl;
  163. //strcpy(this->boja,boja);
  164. //this->godini=godini;
  165. strcpy(this->rasa,rasa);
  166. }
  167. // override na zivotno funkcijata
  168. void print(){
  169. cout<<"Kuce: "<<boja<<" "<<godini<<" "<<rasa<<endl;
  170. }
  171. // ako e nad 5 godini, prai 20 damage, ako e nad 1 i pod 5 godini prai 30 damage, ako e pod 1 godina prai 10 damage
  172. float damage(){
  173. if(godini>1 && godini<=5){
  174. return 30;
  175. }else if(godini>5){
  176. return 20;
  177. }else{
  178. return 10;
  179. }
  180. }
  181. //
  182. char tip(){
  183. return 'k';
  184. }
  185.  
  186. };
  187.  
  188. class Mace:public Zivotno{
  189. private:
  190. bool daliPrede;
  191. public:
  192. Mace(){
  193. //cout<<"Default constructor Mace"<<endl;
  194. }
  195. Mace(char boja[],int godini,bool daliPrede):Zivotno(boja,godini){
  196. this->daliPrede=daliPrede;
  197. }
  198. // preoptovaruvame virtuelna funkcija
  199. void print(){
  200. cout<<"Mace: "<<boja<<" "<<godini<<" "<<daliPrede<<endl;
  201. }
  202. // preoptovaruvame cisto virtuelna funkcija
  203. float damage(){
  204. if(daliPrede){
  205. return 1;
  206. }else{
  207. return 11;
  208. }
  209. }
  210.  
  211. char tip(){
  212. return 'm';
  213. }
  214. ~Mace(){
  215. cout<<"Default destructor Mace"<<endl;
  216. }
  217. };
  218.  
  219. void printZivotni(Zivotno **niza,int n){
  220. int flag=1;
  221. for(int i=0;i<n;i++){
  222. if(niza[i]->damage()<10){
  223. cout<<"Ne pravat site zivotni nad 10 damage"<<endl;
  224. flag=0;
  225. break;
  226. }
  227. }
  228. if(flag==1){
  229. cout<<"Site zivotni pravat nad 10 damage"<<endl;
  230. }
  231. }
  232.  
  233. void najvekjeDamage(Zivotno **niza,int n){
  234. float maxDamage=0;
  235. int pamtiIndex;
  236. for(int i=0;i<n;i++){
  237. if(niza[i]->damage()>maxDamage){
  238. maxDamage=niza[i]->damage();
  239. pamtiIndex=i;
  240. }
  241. }
  242. cout<<"Najvekje damage pravi zivotnoto:"<<endl;
  243. niza[pamtiIndex]->print();
  244. }
  245.  
  246. void odnosZivotni(Zivotno **niza,int n){
  247. int brojKucinja=0;
  248. int brojMacinja=0;
  249. Kuce *pK;
  250. Mace *pM;
  251. for(int i=0;i<n;i++){
  252.  
  253. pK=dynamic_cast<Kuce*>(niza[i]);
  254. if(pK!=0){
  255. brojKucinja++;
  256. }
  257. pM=dynamic_cast<Mace*>(niza[i]);
  258. if(pM!=0){
  259. brojMacinja++;
  260. }
  261. // bez dynamic cast so posebna cisto virtuelna funkcija
  262.  
  263. if(niza[i]->tip()=='k'){
  264. brojKucinja++;
  265. }else if(niza[i]->tip()=='m'){
  266. brojMacinja++;
  267. }
  268.  
  269. }
  270. cout<<"Kucinja "<<brojKucinja<<":"<<brojMacinja<<" Macinja"<<endl;
  271. }
  272.  
  273. int main(){
  274. // obicna niza od zivotni
  275. //Zivotno niza[3];
  276. // dinamicki alocirana niza od zivotni
  277. //Zivotno *niza=new Zivotno[3];
  278. // dinamicki alocirana niza od pokazuvaci
  279. Zivotno **niza=new Zivotno*[3];
  280. niza[0]=new Kuce("crno",15,"labrador");
  281. niza[1]=new Kuce("crno-kafeavo",4,"d.o.dz");
  282. niza[2]=new Mace("belo",2,true);
  283.  
  284. //printZivotni(niza,3);
  285. //najvekjeDamage(niza,3);
  286. //odnosZivotni(niza,3);
  287. delete []niza;
  288. return 0;
  289. }
Advertisement
Add Comment
Please, Sign In to add comment