2 votes

Accéder à une classe dérivée lorsque seul l'en-tête de la classe de base est inclus

J'essaie de comprendre s'il existe un moyen de définir une directive include pour une classe de base tout en étant capable d'accéder aux classes dérivées qui sont définies dans un en-tête différent de celui de la classe de base. Par exemple :

Dans GenericObject.h :

class GenericObject { 
    /* whatever - shared properties and methods implemented in .cpp file */ 
}

Dans Ball.h :

class Ball : public GenericObject { 
    /* whatever - implementation details are in the .cpp file */
}

Maintenant, dans un autre fichier d'implémentation (appelons-le main.cpp), j'ai #include d "GenericObject.h" . Dans main.cpp, je veux pouvoir accéder aux membres de la classe GenericObject ainsi qu'à la classe Ball et à toute autre classe dérivée de GenericObject. D'après mes essais jusqu'à présent, le compilateur ne reconnaîtra pas l'identifiant Ball si j'essaie de le déclarer de la manière suivante Ball * b; et donc tous les membres qui appartiennent à sa classe.

Est-ce parce que mon #include 'd "GenericObject.h" n'est pas également en train de relier qu'il y a cette classe Ball dérivée à laquelle je peux accéder ? Je peux identifier et utiliser correctement la classe Ball si je "#include "Ball.h" mais je n'imagine pas que je doive inclure tous les fichiers d'en-tête des classes dérivées de la classe GenericObject, n'est-ce pas ?

Si je devais deviner comment cela pourrait fonctionner, je dirais que quelque chose comme une déclaration de prototype pour la classe Ball à l'intérieur de la classe GenericObject serait un pas dans la bonne direction, mais je ne suis pas sûr qu'un prototype de classe soit même une chose.

Merci à tous pour votre lecture et vos commentaires !

5voto

Crazy Eddie Points 23778

Non, vous ne pouvez pas utiliser un identifiant qui n'a pas encore été décrit. Cela inclut toute classe, qu'elle dérive d'une base ou non.

Il me semble que vous violez Liskov . Si vous recevez une référence ou un pointeur vers une base, vous ne devez rien faire qui nécessite que vous sachiez s'il y a un dérivé ou non. Vous ne devez utiliser que l'interface de la base. Il n'est donc plus nécessaire d'inclure les en-têtes des classes dérivées lorsque vous n'utilisez pas un élément défini uniquement dans leur interface.

1voto

R Sahu Points 24027

Je ne peux pas imaginer que je doive inclure tous les fichiers d'en-tête des classes dérivées de la classe GenericObject classe, n'est-ce pas ?

Si vous souhaitez accéder à une classe dérivée de GenericObject autrement que par le biais d'un pointeur ou d'une référence, vous devrez #include le fichier d'en-tête pour eux.

Si vous pouvez vous contenter d'utiliser des pointeurs et des références, vous n'avez pas besoin de #include les fichiers d'en-tête, mais vous devez toujours les déclarer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X