destructores y herencia c++

rulovic
10 de Septiembre del 2009
Hola a todos, toy haciendo un programilla en c++ y m da un error aver si me podeis ayudar:
tengo la siguiente clase base:
//--------------------------------------------------//
#ifndef persona_H
#define persona_H

#include <stdio.h>
#include <string.h>
#include <iostream>


class persona
{
protected:
char* nombre;
char apellido[20];
int edad;
public:
persona();
virtual ~persona();
char* leerNombre();
char* leerAp();
int leerEdad();
void ponNombre(char* n);
void ponEdad(int e);
void ponApp(char* a);
virtual void imprimeVals();
};
//implementacion
#include "persona.h"

persona::persona()
{
nombre = new char(50);
}

persona::~persona()
{
std::cout << "destructor persona llamado" << std::endl;
delete nombre;
}

char* persona::leerNombre()
{
return nombre;
}

int persona::leerEdad()
{
return edad;
}

void persona::ponNombre(char* n)
{
this->nombre = n;
}

void persona::ponEdad(int e)
{
this->edad = e;
}

char* persona::leerAp()
{
return apellido;
}

void persona::ponApp(char *a)
{
strcpy(apellido, a);
}

void persona::imprimeVals()
{
std::cout << "hola" << std::endl;
}
#endif

de esta derivan dos clases
empleado
#ifndef empleado_H
#define empleado_H

#include "persona.h"
#include <iostream>


class empleado:public persona
{
public:
empleado();
~empleado();
void setSalario(float m);
float getSalario();
char* getDpto();
void setDpto(char* d);
void imprimeVals();
private:
char* dpto;
float salario;
};
#endif

//implmentacion

#include "empleado.h"

empleado::empleado()
{
dpto = new char(20);
salario = 0;
}

empleado::~empleado()
{
std::cout << "Destructor empleado llamado" << std::endl;
delete dpto;
}

void empleado::setSalario(float m)
{
this->salario = m;
}

float empleado::getSalario()
{
return salario;
}

char* empleado::getDpto()
{
return dpto;
}

void empleado::setDpto(char* d)
{
this->dpto = d;
}

void empleado::imprimeVals()
{
std::cout << "Machaquilla" << std::endl;
std::cout << "Nombre: "<< this->nombre << std::endl;
std::cout << "Edad: " << this->edad << std::endl;
std::cout << "Departamento " << this->dpto << std::endl;
std::cout << "Salario: " << this->salario << std::endl;
}

jefe:
#ifndef jefe_H
#define jefe_H

#include "persona.h"
#include <iostream>

class jefe:public persona
{
public:
jefe();
~jefe();
void setSalario(float m);
float getSalario();
char* getDpto();
void setDpto(char* d);
void imprimeVals();
private:
char* dpto;
float salario;
};

#endif

//implementacion

#include "jefe.h"

jefe::jefe()
{
dpto = new char(20);
salario = 0;
}

jefe::~jefe()
{
std::cout << "Destructor jefe llamado" << std::endl;
delete dpto;
}

void jefe::setSalario(float m)
{
this->salario = m;
}

float jefe::getSalario()
{
return salario;
}

char* jefe::getDpto()
{
return dpto;
}

void jefe::setDpto(char* d)
{
this->dpto = d;
}

void jefe::imprimeVals()
{
std::cout << "Jefazo" << std::endl;
std::cout << "Nombre: "<< this->nombre << std::endl;
std::cout << "Edad: " << this->edad << std::endl;
std::cout << "Departamento " << this->dpto << std::endl;
std::cout << "Salario: " << this->salario << std::endl;
}

el main:
#include <iostream>
#include <conio.h>
#include "empleado.h"
#include "jefe.h"

using namespace std;

int main()
{
char no[20];
char dep[15];
int age = 0;
float salario = 0;
persona* empi = new empleado();
persona* jefote = new jefe();

cout << "Introduce el nombre del empleado ";
cin >> no;
cout << endl << "Introduce su edad ";
cin >> age;
//cout << endl << "Introduce el departamento dnd curra ";
//cin >> dep;
//cout << endl << "Introduce su sueldo ";
//cin >> salario;
empi->ponNombre(no);
empi->ponEdad(age);
//empi->setDpto(dep);
//empi->setSalario(salario);
cout << "Introduce el nombre del jefe ";
cin >> no;
cout << endl << "Introduce su edad ";
cin >> age;
//cout << endl << "Introduce el departamento dnd curra ";
//cin >> dep;
//cout << endl << "Introduce su sueldo ";
//cin >> salario;
jefote->ponNombre(no);
jefote->ponEdad(age);
//jefote->setDpto(dep);
//jefote->setSalario(salario);
empi->imprimeVals();
jefote->imprimeVals();
delete empi;
delete jefote;
getch();
return 0;

}

el caso es que todo va sin problemas hasta ejecutar el ultimo delete ahi me da un error y el programa termina.
Alguna idea de dnd esta el problema??
Saludosss