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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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?