Newsgroup: it.comp.lang.c++
Titolo: problema poliformismo

qui sotto vi includo il seguente codice nella quale durante la fase di 
compilazione mi da il seguente errore
Figura::Perimetro() not overriden in Figura1
dove sbaglio
Grazie per l'interesse
Christian
#include <iostream.h>
#include <math.h>
#include <conio.h>
//definizione della classe astratta Figura
class Figura
{
public:
	virtual void Perimetro()=0;
	virtual void Area()=0;
};
//Definizione e Implementazione classe Parametro
class Parametro
{
	int param;
public:
	void SetParam(int);
	int GetParam();
};
void Parametro::SetParam(int p)
{
	param=p;
}
int Parametro::GetParam()
{
	return param;
}
//Definizione e Implementazione class Figura1
class Figura1:public Figura,public Parametro
{
public:
	Figura1();
	Figura1(int);
};
Figura1::Figura1()
{
	SetParam(0);
}
Figura1::Figura1(int p)
{
	SetParam(p);
}
//Implementazione classe cerchio
class Cerchio:public Figura1
{
public:
	Cerchio();
	Cerchio(int);
	virtual void Perimetro();
	virtual void Area();
};
Cerchio::Cerchio():Figura1(){} /*1øcostruttore di classe cerchio
chiama il 1ø costruttore di classe Figura1,se non si specifica allora
viene creato il costruttore senza parametri*/
Cerchio::Cerchio(int r):Figura1(r){} /*2øcostruttore di classe cerchio
chiama il 2ø costruttore di classe Figura1*/
void Cerchio::Perimetro()
{
	int raggio=GetParam();
	cout<<"Sono un cerchio di raggio "<<raggio<<endl;
	cout<<"La mia circonferenza S( "<<2*M_PI*raggio<<endl;
}
void Cerchio::Area()
{
	int raggio=GetParam();
	cout<<"Sono un Cerchio di raggio "<<raggio<<endl;
	cout<<"La mia area S( "<<M_PI*raggio*raggio<<endl;
}
//Definizione ed Implementazione della classe Quadrato
class Quadrato:public Figura1
{
public:
	Quadrato();
	Quadrato(int);
	virtual void Perimetro();
	virtual void Area();
};
Quadrato::Quadrato():Figura1(){} /*1øcostruttore di classe cerchio
chiama il 1ø costruttore di classe Figura1,se non si specifica allora
viene creato il costruttore senza parametri*/
Quadrato::Quadrato(int l):Figura1(l){} /*2øcostruttore di classe cerchio
chiama il 2ø costruttore di classe Figura1*/
void Quadrato::Perimetro()
{
	int lato=GetParam();
	cout<<"Sono un quadrato di lato "<<lato<<endl;
	cout<<"Il mio Perimetro S( "<<4*lato<<endl;
}
void Quadrato::Area()
{
	int lato=GetParam();
	cout<<"Sono un Quadrato di lato "<<lato<<endl;
	cout<<"La mia area S( "<<lato*lato<<endl;
}
int main()
{
	Figura* f1;
	Figura* f2;
	f1=new Cerchio;
	f1->Perimetro();
	f1->Area();
	f2=new Quadrato(5);
	f2->Perimetro();
	f2->Area();
	//dynamic_cast<Figura1*>(f1)->SetParam(10); /*f1->SetParam(10);non funziona*/
	f1->Perimetro();
	f1->Area();
	delete f1;
	delete f2;
	cin.get();
	return 0;
}


Il compilatore ti sta avvertendo che nella classe Figura1 che eredita
pubblicamente dalla classe Figura non hai messo la dichiarazione e la
definizione di Perimetro().
Ti ricordo che nella classe Figura, avevi gia' messo Perimetro come metodo
virtuale puro:
//definizione della classe astratta Figura
class Figura
{
public:
virtual void Perimetro()=0;
virtual void Area()=0;
};
Cio' significa che tutte le classi che derivano da Figura, devono
specificare il metodo Perimetro, perche' tu facendola classe astratta,
obblighi tutte le sottoclassi a ben specificarne tutti i suoi metodi.
Dovrai per cui dichiarare in Figura1 un metodo Perimetro().
Lo stesso problema lo hai col metodo Area().
Inoltre a questi 2 metodi io non farei restituire void, anche se per il
momento ti limiti a una stampa a video del risultato.
Maurus