Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*NOMBRE: Álvaro García León
- GRUPO: A2
- NOMBRE DEL FICHERO: Subasta6.cpp
- DESCRIPCIÓN: Archivo "cliente" implementado mediante objetos.
- */
- #include <iostream>
- #include <cstdlib>
- #include "Articulo.h"
- #include "ArticuloInmediato.h"
- using namespace std;
- void gestiona(Articulo arti);
- void pgestiona(Articulo *arti);
- //PROGRAMA PRINCIPAL
- int main()
- {
- //EJERCICIO-1-----------------------------------------------------------------------------------------------------------------
- //ArticuloInmediato unArticulo1("Producto a subastar",100,1200);
- //Articulo unArticulo2= ArticuloInmediato("Producto a subastar",100,1000);
- //unArticulo1.muestra();//El objeto actúa como la clase ArticuloInmediato,mostrando su precio inmediato.
- //unArticulo2.muestra();
- /*Al crear el objeto, este adopta los métodos de la clase en la que está declarada, debido al enlazado temprano de Dev-Cpp,
- de este modo, se muestra el primer objeto como la clase ArticuloInmediato y el segundo como Artículo.*/
- /*unArticulo1=unArticulo2;*/
- /* C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
- 31 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp no match for 'operator=' in 'unArticulo1 = unArticulo2'
- note C:\Users\Alvaro\Desktop\Practica 3\ArticuloInmediato.h:6 candidates are: ArticuloInmediato& ArticuloInmediato::operator=(const ArticuloInmediato&)
- C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error] [Subasta6.o] Error 1
- Esto se debe a que no podemos asignar un objeto de tipo Articulo a uno de tipo ArticuloInmediato, pues el primero es heredado del segundo
- y sería como restringir la clase madre.
- */
- //unArticulo2=unArticulo1;//Efectivamente, se comporta como Articulo.
- //unArticulo1.getPrecioInmediato();//unArticulo1.getPrecioInmediato(); La revisión no muestra ningún fallo aquí.
- //unArticulo2.getPrecioInmediato();
- /*La revisión muestra el siguiente fallo:
- C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
- 52 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp 'class Articulo' has no member named 'getPrecioInmediato'
- C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error] [Subasta6.o] Error 1
- Este error es debido a que al estar declarado como Articulo, no puede emplear métodos de la clase hija.(ArticuloInmediato)
- */
- //EJERCICIO-2-----------------------------------------------------------------------------------------------------------------
- //ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
- //Articulo * punArticulo2= new ArticuloInmediato("Producto a subastar",100,1000);
- //No se produce ningún error en estas dos instrucciones al igual que antes, porque la primera se declara del mismo tipo
- //que el objeto es construido y la segunda porque la clase madre puede contener un objeto de la clase hija.
- //unArticulo3=unArticulo4;
- /* C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
- 50 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp invalid conversion from `Articulo*' to `ArticuloInmediato*'
- C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error] [Subasta6.o] Error 1
- La conversión del puntero de la clase madre a la hija no es posible, sin embargo la inversa si lo es.
- */
- //unArticulo4=unArticulo3;
- //No se produce error dado que es el mismo caso que antes de usar punteros.
- //punArticulo1->muestra();
- //punArticulo2->muestra();
- //Mismo resultado durante la ejecución.
- //punArticulo1=punArticulo2; //Se produce el mismo error al intentar asignar a la clase hija, la clase madre.
- //punArticulo2=punArticulo1; //Tampoco produce error.
- //unArticulo3->getPrecioInmediato(); Igualmente con punteros, la sintaxis es correcta.
- //unArticulo4->getPrecioInmediato();
- /*La revisión muestra el siguiente fallo:
- C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp In function `int main()':
- 52 C:\Users\Alvaro\Desktop\Practica 3\Subasta6.cpp 'class Articulo' has no member named 'getPrecioInmediato'
- C:\Users\Alvaro\Desktop\Practica 3\Makefile.win [Build Error] [Subasta6.o] Error 1
- Vemos también en este caso que la clase madre no puede acceder a los métodos de la clase hija.
- */
- //EJERCICIO-3--------------------------------------------------------------------------------------------------------------
- /*Para conseguir polimorfismo, editamos el fichero Articulo.h poniendo el calificador virtual ante los
- dos métodos que son redefinidos en ArticuloInmediato. Una vez hecho esto me dispongo a comprobar
- que efectivamente el objeto punArticulo2 se ha de comportar como la clase con la que se ha construido.
- */
- //punArticulo2->muestra();
- //EJERCICIO-4--------------------------------------------------------------------------------------------------------------
- //unArticulo2.muestra();
- /*Efectivamente volvemos a obtener el error: "undefined reference to `vtable for Articulo`" el cual nos indica
- que el virtual necesita punteros para su funcionamiento. Es por eso que no hay poliformismo.*/
- //EJERCICIO-5---------------------------------------------------------------------------------------------------------------
- //ArticuloInmediato unArticulo1("Producto a subastar",100,1200);
- //gestiona(unArticulo1);
- //Efectivamente, la accion "gestiona" trata al parámetro como si fuese de la clase Articulo a pesar de su declaración y
- //construcción como ArticuloInmediato.
- //EJERCICIO-6--------------------------------------------------------------------------------------------------------------
- //ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
- //gestiona(*punArticulo1);
- //Al igual que con objetos, sigue sin haber polimorfismo.
- //EJERCICIO-7--------------------------------------------------------------------------------------------------------------
- //ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
- //Articulo * punArticulo2= new Articulo("Producto a subastar",100);
- //Tanto pgestiona(punArticulo1); como pgestiona(punArticulo2); actúan correctamente mostrando el puntero de la clase
- // a la que pertenecen, aunque el procedimiento pida explicitamente un puntero a Articulo.
- //EJERCICIO-8---------------------------------------------------------------------------------------------------------------
- ArticuloInmediato * punArticulo1= new ArticuloInmediato("Producto a subastar",100,1200);
- Articulo * punArticulo2= new Articulo("Producto a subastar",100);
- punArticulo1->muestra();
- punArticulo2->muestra();
- //He modificaco del fichero ArticuloInmediato.cpp de la siguiente manera:
- /*Incluyendo la redefinición del método getDescripcion.
- char * ArticuloInmediato::getDescripcion()
- {
- return(strcat("[INM]", Articulo::getDescripcion()));
- }
- Incluyendo el método en el fichero ArticuloInmediato.h:
- public:
- char * getDescripcion();
- ...
- ...
- */
- //En un principio no nos ha funcionado precisamente debido a que se nos ha olvidado incluir el modificador "virtual"
- //antes del método correspondiente en el fichero "ArticuloInmediato.h" .
- //EJERCICIO-9---------------------------------------------------------------------------------------------------------------
- system("PAUSE");
- return 0;
- }
- void gestiona(Articulo arti)
- {
- //Variables
- int opcion,precio;
- //Principio
- while(opcion!=3)
- {
- cout<<"Desea pujar, mostrar o salir: "<<endl;
- cout<<"\t 1.Pujar"<<endl;
- cout<<"\t 2.Mostrar"<<endl;
- cout<<"\t 3.Salir"<<endl;
- cin>>opcion;
- if(opcion==1)
- {
- cout<<"Introduce el precio de la puja: "<<endl;
- cin>>precio;
- arti.puja(precio);
- }
- if(opcion==2)
- {
- arti.muestra();
- }
- }
- }
- void pgestiona(Articulo *arti)
- {
- //Variables
- int opcion,precio;
- //Principio
- while(opcion!=3)
- {
- cout<<"Desea pujar, mostrar o salir: "<<endl;
- cout<<"\t 1.Pujar"<<endl;
- cout<<"\t 2.Mostrar"<<endl;
- cout<<"\t 3.Salir"<<endl;
- cin>>opcion;
- if(opcion==1)
- {
- cout<<"Introduce el precio de la puja: "<<endl;
- cin>>precio;
- arti->puja(precio);
- }
- if(opcion==2)
- {
- arti->muestra();
- }
- }
- }
Add Comment
Please, Sign In to add comment