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.