elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error en mi programa en tiempo de ejecución, estoy practicando polimorfimo en C+
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error en mi programa en tiempo de ejecución, estoy practicando polimorfimo en C+  (Leído 1,491 veces)
theluigy13etv

Desconectado Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
Error en mi programa en tiempo de ejecución, estoy practicando polimorfimo en C+
« en: 15 Julio 2015, 16:49 pm »

Hola gente :) , estoy practicando el tema de polimorfimos en C++ y estoy usando el libro de Deitel titulado C++ Cómo programar 6ta edición. Como IDE utilizo el Dev C++ 5.11 y como sistema operativo Windows 7 Ultimate 64 bits.

Resulta que estoy en el capítulo 13 y he copiado los códigos tal y como salen en el libro y cuando lo compilo no hay problema, el error está cuando ejecuto el programa.

La idea es la siguiente. Declaro una clase llamada EmpleadoPorComision la cual será la clase padre o clase base. Luego declaro una clase hija llamada EmpleadoBaseMasComision la cual hereda de EmpleadoPorComision.
Ambas clases declaran el método imprimir el cual ha sido además declarado como virtual para poder dar uso del polimorfismo.

Dentro de la función main se crean los objetos correspondientes a las dos clases: empleadoPorComision y empleadoBaseMasComision.
Luego se declaran dos punteros: empleadoPorComisionPtr y empleadoBaseMasComisionPtr ,el primero del tipo de la clase padre y el segundo del tipo de la clase hija.
Luego se asigna al puntero empleadoPorComisionPtr el objeto de la clase padre empleadoPorComision y se intenta llamar al método imprimir de dicho objeto mediante el puntero:

empleadoPorComisionPtr = &empleadoPorComision ;
empleadoPorComisionPtr->imprimir();
                      // Desde aquí es donde se genera el error en tiempo de ejecución

Lo mismo se intenta hacer con empleadoBaseMasComisionPtr, que apunte al objeto de la clase hija empleadoBaseMasComision y luego llamar al método imprimir mediante el puntero:

empleadoBaseMasComisionPtr = &empleadoBaseMasComision ;
empleadoBaseMasComisionPtr->imprimir(); 
        // aquí también es donde se genera el error en tiempo de ejecución

Por último se intenta asignar la dirección del objeto empleadoBaseMasComision al puntero de la clase padre empleadoPorComisionPtr y llamar al método imprimir:

empleadoPorComisionPtr = &empleadoBaseMasComision;
empleadoPorComisionPtr->imprimir();


El código me parece que está bien porque es idéntico al que figura en el libro y el compilador no me marca ningún error de sintaxis pero sí el programa se para en tiempo de ejecución. El código es el siguiente:

EmpleadoPorComision.h
Código
  1. // EmpleadoPorComision.h
  2.  
  3. #ifndef COMISION_H
  4. #define COMISION_H
  5.  
  6. #include <string>
  7. using std::string;
  8.  
  9. class EmpleadoPorComision {
  10.  
  11.   public:
  12.  
  13.      EmpleadoPorComision(const string &, const string &, const string &,
  14.         double = 0.0, double = 0.0);
  15.      ~EmpleadoPorComision(); // destructor
  16.  
  17.      void setPrimerNombre(const string &);
  18.      string getPrimerNombre() const;
  19.  
  20.      void setApellidoPaterno(const string &);
  21.      string getApellidoPaterno() const;
  22.  
  23.      void setNumeroSeguroSocial(const string &);
  24.      string getNumeroSeguroSocial() const;
  25.  
  26.      void setVentasBrutas(double);
  27.      double getVentasBrutas() const;
  28.  
  29.      void setTarifaComision(double);
  30.      double getTarifaComision() const;
  31.  
  32.      virtual double ingresos() const;
  33.      virtual void imprimir() const;
  34.  
  35.   private:
  36.      string primerNombre;
  37.      string apellidoPaterno;
  38.      string numeroSeguroSocial;
  39.      double ventasBrutas;
  40.      double tarifaComision;
  41. };
  42.  
  43. #endif
  44.  

EmpleadoPorComision.cpp
Código
  1. // EmpleadoPorComision.cpp
  2. #include <iostream>
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include "EmpleadoPorComision.h"
  7.  
  8. // Constructor
  9. EmpleadoPorComision::EmpleadoPorComision(
  10.   const string &nombre, const string &apellido, const string &nss,
  11.   double ventas, double tarifa)
  12.   : primerNombre(nombre), apellidoPaterno(apellido), numeroSeguroSocial(nss) {
  13.  
  14.      setVentasBrutas(ventas);
  15.      setTarifaComision(tarifa);
  16. }
  17.  
  18. EmpleadoPorComision::~EmpleadoPorComision() {
  19. }
  20.  
  21. void EmpleadoPorComision::setPrimerNombre(const string &nombre) {
  22.   primerNombre = nombre;
  23. }
  24.  
  25. string EmpleadoPorComision::getPrimerNombre() const {
  26.   return primerNombre;
  27. }
  28.  
  29. void EmpleadoPorComision::setApellidoPaterno(const string &apellido) {
  30.   apellidoPaterno = apellido;
  31. }
  32.  
  33. string EmpleadoPorComision::getApellidoPaterno() const {
  34.   return apellidoPaterno;
  35. }
  36.  
  37. void EmpleadoPorComision::setNumeroSeguroSocial(const string &nss) {
  38.   numeroSeguroSocial = nss;
  39. }
  40.  
  41. string EmpleadoPorComision::getNumeroSeguroSocial() const {
  42.   return numeroSeguroSocial;
  43. }
  44.  
  45. void EmpleadoPorComision::setVentasBrutas(double ventas) {
  46.   ventasBrutas = (ventas < 0.0) ? 0.0 : ventas;
  47. }
  48.  
  49. double EmpleadoPorComision::getVentasBrutas() const {
  50.   return ventasBrutas;
  51. }
  52.  
  53. void EmpleadoPorComision::setTarifaComision(double tarifa) {
  54.   tarifaComision = (tarifa > 0.0 && tarifa < 1.0) ? tarifa : 0.0;
  55. }
  56.  
  57. double EmpleadoPorComision::getTarifaComision() const {
  58.   return tarifaComision;
  59. }
  60.  
  61. double EmpleadoPorComision::ingresos() const {
  62.   return getTarifaComision() * getVentasBrutas();
  63. }
  64.  
  65. void EmpleadoPorComision::imprimir() const {
  66.   cout << "empleado por comision: "
  67.      << getPrimerNombre() << ' ' << getApellidoPaterno()
  68.      << "\nnumero de seguro social: " << getNumeroSeguroSocial()
  69.      << "\nventas brutas: " << getVentasBrutas()
  70.      << "\ntarifa de comision: " << getTarifaComision();
  71. }
  72.  

EmpleadoBaseMasComision.h
Código
  1. // EmpleadoBaseMasComision.h
  2. #ifndef BASEMAS_H
  3. #define BASEMAS_H
  4.  
  5. #include <string>
  6. using std::string;
  7.  
  8. #include "EmpleadoPorComision.h" // Declaración de la clase EmpleadoPorComision
  9.  
  10. class EmpleadoBaseMasComision : public EmpleadoPorComision {
  11.   public:
  12.      EmpleadoBaseMasComision(string const &, string const &, string const &,
  13.         double = 0.0, double = 0.0, double = 0.0);
  14.      ~EmpleadoBaseMasComision();
  15.  
  16.      void setSalarioBase(double);
  17.      double getSalarioBase() const;
  18.  
  19.      virtual double ingresos() const;
  20.      virtual void imprimir() const;
  21.  
  22.   private:
  23.      double salarioBase;
  24. };
  25.  
  26. #endif
  27.  

EmpleadoBaseMasComision.cpp
Código
  1. // EmpleadoBaseMasComision.cpp
  2. #include <iostream>
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include "EmpleadoBaseMasComision.h"
  7.  
  8. // Constructor
  9. EmpleadoBaseMasComision::EmpleadoBaseMasComision(
  10.   const string &nombre, const string &apellido, const string &nss,
  11.   double ventas, double tarifa, double salario)
  12.   // Llamada explícita al constructor de la clase base
  13.   : EmpleadoPorComision(nombre, apellido, nss, ventas, tarifa) {
  14.  
  15.   setSalarioBase(salario);
  16. }
  17.  
  18. // Destructor
  19. EmpleadoBaseMasComision::~EmpleadoBaseMasComision() {
  20. }
  21.  
  22. void EmpleadoBaseMasComision::setSalarioBase(double salario) {
  23.   salarioBase = (salario < 0.0) ? 0.0 : salario;
  24. }
  25.  
  26. double EmpleadoBaseMasComision::getSalarioBase() const {
  27.   return salarioBase;
  28. }
  29.  
  30. double EmpleadoBaseMasComision::ingresos() const {
  31.   return EmpleadoPorComision::ingresos() + getSalarioBase();
  32. }
  33.  
  34. void EmpleadoBaseMasComision::imprimir() const {
  35.   cout << "con salario base ";
  36.   // Invoca a la función imprimir de EmpleadoPorComision
  37.   EmpleadoPorComision::imprimir();
  38.  
  39.   cout << "\nsalario base: " << getSalarioBase();
  40. }
  41.  

main.cpp
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. using std::cin;
  5. using std::fixed;
  6.  
  7. #include <iomanip> // setprecision
  8. using std::setprecision;
  9.  
  10. // Incluye las definiciones de las clases
  11.  
  12. // #include "EmpleadoPorComision.h"; // Ya está incluído dentro de EmpleadoBaseMasComision.h
  13. #include "EmpleadoBaseMasComision.h"
  14.  
  15. int main(int argc, char** argv) {
  16.  
  17.   // Crea el objeto de la clase base
  18.   EmpleadoPorComision empleadoPorComision(
  19.      "Sue", "Jones", "222-22-2222", 10000, .06);
  20.  
  21.   // Crea un apuntandor de la clase base
  22.   EmpleadoPorComision *empleadoPorComisionPtr = 0; // 0
  23.  
  24.   // Crea un objeto de la clase derivada
  25.   EmpleadoBaseMasComision empleadoBaseMasComision(
  26.      "Bob", "Lewis", "333-33-3333", 5000, .04, 300);
  27.  
  28.   // Crea un apuntador de la clase derivada
  29.   EmpleadoBaseMasComision *empleadoBaseMasComisionPtr = 0;
  30.  
  31.   // Establece el formato de salida de punto flotante
  32.   cout << fixed << setprecision(2);
  33.  
  34.   // Imprime los objetos usando vinculación estática
  35.   cout << "Invocando a la funcion imprimir en objetos de la clase base "
  36.   << "\ny la clase derivada con vinculacion estatica\n\n";
  37.   empleadoPorComision.imprimir(); // vinculación estática
  38.   cout << "\n\n";
  39.   empleadoBaseMasComision.imprimir(); // vinculación estática
  40.  
  41.   // Imprime los objetos usando vinculación dinámica
  42.   cout << "\n\n\nInvocando a la funcion imprimir en objetos de la clase base "
  43.   << "y la \nclase derivada con vinculacion dinamica";
  44.  
  45.   // Orienta el apuntador de la clase base al objeto de la clase base e imprime
  46.   empleadoPorComisionPtr = &empleadoPorComision;
  47.   cout << "\n\nAl llamar a la funcion virtual imprimir con un apuntador"
  48. << "\nde la clase base a un objeto de la clase base se invoca a la "
  49. << "funcion imprimir de la clase base:\n\n";
  50.   empleadoPorComisionPtr->imprimir(); // Invoca a la función imprimir de la clase base
  51.  
  52.   // Orienta el apuntador de la clase derivada al objeto de la clase derivada e imprime
  53.   empleadoBaseMasComisionPtr = &empleadoBaseMasComision;
  54.   cout << "\n\nAl llamar a la funcion virtual imprimir con un apuntador"
  55. << "de la clase derivada\na un objeto de la clase base se invoca a "
  56. << "la funcion imprimir de la clase derivada:\n\n";
  57.   empleadoBaseMasComisionPtr->imprimir(); // Invoca a la función imprimir de la clase derivada
  58.  
  59.   // Orienta un apuntador de la clase base a un objeto de la clase derivada e imprime
  60.   empleadoPorComisionPtr = &empleadoBaseMasComision;
  61.   cout << "\n\nAl llamar a la funcion virtual imprimir con un apuntador de la clase base"
  62.      << "\na un objeto de la clase derivada se invoca a la funcion "
  63. << "imprimir de la clase derivada\n\n";
  64.  
  65. // Polimorfismo: invoca a la función imprimir de EmpleadoBaseMasComision;
  66. // Apuntador de la clase base a un objeto de la clase derivada
  67.   empleadoPorComisionPtr->imprimir(); // invoca a la función imprimir de la clase base. Manda el tipo del puntero
  68.   cout << endl;
  69.  
  70.   cin.get();
  71.   cin.get();
  72. return 0;
  73. }
  74.  

El mensaje de error que recibo es el siguiente:


Pero no me explico por qué me sale dicho mensaje de error. Quisiera que por favor me ayuden a encontrar el error que estoy cometiendo porque yo no lo encuentro. Gracias


« Última modificación: 15 Julio 2015, 17:04 pm por theluigy13etv » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.414


ASMático


Ver Perfil WWW
Re: Error en mi programa en tiempo de ejecución, estoy practicando polimorfimo en C+
« Respuesta #1 en: 15 Julio 2015, 18:27 pm »

Es interesante saber el código de error. Si no te lo muestra, haz esto:

Ve a donde esté el ejecutable del programa, y abre una ventana de comandos.
Ejecuta el archivo invocándolo desde la ventana de comandos.
Luego, en la misma ventana, escribe:
Código
  1. echo %errorlevel%

Y pon por aquí el código. No me paré a mirar mucho el código, ya que es muy largo. Sabiendo el error al menos habrá un punto de referencia.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
error 458 en tiempo de ejecucion
Programación Visual Basic
wACtOr 0 2,607 Último mensaje 18 Junio 2007, 16:20 pm
por wACtOr
Ayuda Error 92 en tiempo de Ejecucion
Programación Visual Basic
mastercss 8 5,361 Último mensaje 23 Abril 2014, 14:46 pm
por abkanis
winsock error 10035 en tiempo de ejecucion
Programación Visual Basic
Dark4ngel 3 2,804 Último mensaje 10 Noviembre 2011, 18:12 pm
por Dark4ngel
error en tiempo de ejecución
Programación C/C++
flony 0 1,262 Último mensaje 12 Octubre 2013, 04:24 am
por flony
error en tiempo de ejecucion en programa c++
Programación C/C++
tca153 9 3,323 Último mensaje 9 Agosto 2021, 20:59 pm
por tca153
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines