Notion d'héritage et de classes abstraites
Bonsoir à tous.
Voilà, j'ai un problème avec la notion d'héritage avec des classes abstraites et des méthodes virtuelles. L'héritage se fait sur trois niveaux :
Voici la déclaration de la classe de base :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
class Contenu
{
private :
//Attributs
std::string _nomTypeContenu; //prend la valeur CONTENU_ANIMAL ou CONTENU_VIDE
int _x; //Abscisse de la case
int _y; //Ordonnée de la case
public :
//Méthodes
//Contenu(std::string = CONTENU_VIDE, int = 0, int = 0); //Constructeur
void setAbscisse(int x) { _x = x;};
void setOrdonnee(int y) {_y = y;};
bool operator == (Contenu) const; //surdéfinition de l'opérateur de comparaison;
virtual void deplacer(const int[][MAX]) = 0; //Déplacement d'un animal
virtual void retirer(int [][TAILLE_REELLE]) = 0; //Retire un animal
}; |
Et voici la déclaration de ses classes dérivées :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
//classe fille de Contenu
class Animal : public Contenu
{
protected :
//Attributs
int _population ;
public :
//Méthodes
Animal(int = 0) ; //Constructeur
virtual void deplacer(const int[][MAX]); //Déplacement d'un animal
virtual void retirer(int [][TAILLE_REELLE]); //Retire un animal
};
//classe vide fille de Contenu
class Vide : public Contenu
{
//vide
};
//classe mur
class Mur : public Contenu
{
}; |
Et enfin, les classe elles-mêmes dérivées de la classe Animal :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
//classe fille de Animal et petite fille de Contenu
class Poule : public Animal
{
private :
//Attributs
int _nbPv ;
//variables statiques
static char _predateurPoule;
static char _proiePoule;
static int _nbPoule;
public :
//Méthodes
Poule(int = 50); //Constructeur
int getNbPv() { return _nbPv;};
};
//classe fille de Animal et petite fille de Contenu
class Renard : public Animal
{
private :
//Attributs
int _nbPv;
//vriables statiques
static char _proieRenard;
static char _predateurRenard;
static int _nbRenard;
public :
//Méthodes
Renard(int = 50);//Constructeur
};
//classe fille de Animal et petite fille de Contenu
class Vipere : public Animal
{
private :
//Attributs
int _nbPv ;
//variables statiques
static char _proieVipere;
static char _predateurVipere;
static int _nbVipere;
public :
//Méthodes
Vipere(int = 50);//Constructeur
}; |
Comme ça le problème est posé. :)
Je n'ai pas encore vu la notion de classe abstraite, mais j'ai compris son fonctionnement.
J'ai mis le constructeur de "Contenu" en commentaire. Ai-je le droit de créer cette classe en laissant le constructeur par défaut, sachant qu'elle est virtuelle?
Car en fait quand je teste ce main :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
int main() {
Contenu c1;
Contenu *c;
Poule p1;
Poule *p;
*p = *c;
cout << "le nombre de points de vie est " << p1.getNbPv() << endl;
return 0;
} |
J'obtiens les erreurs suivantes :
error : cannot declare variable 'c1' to be of type 'Contenu'
error : because the following functions are abstract
error : virtual void Contenu::retirer(int (*)[8])
error : virtual void Contenu::deplacer(const int (*)[100])
Merci d'avance à ceux qui veulent bien m'éclairer sur cette notion de classes abstraites. Pourquoi ici elles posent problèmes?