Riprendo la discussione perchè non mi è chiaro il motivo per cui la funzione virtuale pura genera un errore nel programma. Io penso di averla implementata bene. Riposto il codice:

codice:
class Animale{
public:
	Animale(char* ="", int=0, char=' ');
	virtual ~Animale();
	char* get_nome()const{return nome;}
	int get_eta()const{return eta;}
	char get_sesso()const{return sesso;}
	virtual char* get_razza()const=0;
	virtual void stampa();
protected:
	char* nome;
	int eta;
	char sesso;
};

class Cane: public Animale{
public:
	Cane(char* ="", int=0, char=' ', char* ="");
	virtual ~Cane();
	virtual char* get_razza()const{return razza;}
	virtual void stampa();
private:
	char* razza;
};

class Gatto: public Animale{
public:
	Gatto(char* ="", int=0, char=' ', char* ="");
	virtual ~Gatto();
	virtual char* get_razza()const{return razza;}
	virtual void stampa();
private:
	char* razza;
};
codice:
Animale::Animale(char* name, int age, char gender){
	nome=new char[strlen(name)+1];
	strcpy(nome, name);
	eta=age;
	sesso=gender;
}

Animale::~Animale(){
	delete[] nome;
}

void Animale::stampa(){
	cout << "\nnome animale: " << nome;
	cout << "\neta': " << eta;
	cout << "\nsesso: " << sesso << endl;
}

Cane::Cane(char* name, int age, char gender, char* breed):
	Animale(name, age, gender){
	razza=new char[strlen(breed)+1];
	strcpy(razza, breed);
}

Cane::~Cane(){
	delete[] razza;
}

void Cane::stampa(){
	Animale::stampa();
	cout << "razza: " << razza << endl;
}

Gatto::Gatto(char* name, int age, char gender, char* breed):
	Animale(name, age, gender){
	razza=new char[strlen(breed)+1];
	strcpy(razza, breed);
}

Gatto::~Gatto(){
	delete[] razza;
}

void Gatto::stampa(){
	Animale::stampa();
	cout << "razza: " << razza << endl;
}

void crea_animale(Record& r){
	int a_opt;
	int g_opt;
	Animale* ptr=0;
	char* name=new char[12];
	int age;
	char gender;
	char* breed=new char[12];
	cout << "\nInserisci nome: ";
	cin >> setw(12) >> name;
	cout << "Inserisci eta': ";
	cin >> age;
	cout << "Se l'animale e' maschio inserisci 0, se e' femmina 1: ";
	do{
		cin >> g_opt;
		if(g_opt==0) gender='M';
		else if(g_opt==1) gender='F';
		else cout << "Opzione non valida, reinseriscila: ";
	}while(g_opt!=0 && g_opt!=1);
	cout << "Inserisci razza: ";
	cin >> setw(12) >> breed;
	cout << "Se vuoi inserire un cane inserisci 0, se vuoi inserire un gatto inserisci 1: ";
	do{
		cin >> a_opt;
		if(a_opt==0){
			Cane c(name, age, gender, breed);
			cout << "elemento creato:";
			c.stampa();
			r.tipo="Cane";
			Cane* c_ptr=&c;
			ptr=c_ptr;
		}else if(a_opt==1){
			Gatto g(name, age, gender, breed);
			cout << "elemento creato:";
			g.stampa();
			r.tipo="Gatto";
			Gatto* g_ptr=&g;
			ptr=g_ptr;
		}else cout << "Opzione non valida, reinseriscila: ";
	}while(a_opt!=0 && a_opt!=1);
	crea_record(r, ptr);
}

void crea_record(Record& r, Animale* ptr){
	//copia nome
	r.nome=new char[strlen(ptr->get_nome())+1];
	strcpy(r.nome, (ptr->get_nome()));
	//copia eta'
	r.eta=ptr->get_eta();
	//copia sesso
	r.sesso=ptr->get_sesso();
	//copia razza
	r.razza=new char[strlen(ptr->get_razza())+1];
	strcpy(r.razza, (ptr->get_razza()));
	//inserisce data
	char gg[3], mm[3], aa[5];
	cout << "Inserisci data: ";
	cin >> setw(3) >> gg;
	cin.ignore();
	cin >> setw(3) >> mm;
	cin.ignore();
	cin >> setw(5) >> aa;
	r.data_visita=new char[11];
	strcpy(r.data_visita, gg);
	strcat(r.data_visita, "/");
	strcat(r.data_visita, mm);
	strcat(r.data_visita, "/");
	strcat(r.data_visita, aa);
	//inserisce motivazione
	cout << "Inserisci motivazione: ";
	r.motivo=new char[20];
	cin >> setw(20) >> r.motivo;
}
Non posso cambiare i parametri perchè devo seguire il testo della traccia.

Se definisco la classe Animale come virtuale non pura il programma non copia bene il nome e la razza all'interno del record, mentre i parametri come eta e sesso li copia bene.