Syntaxiquement, oui... elle sera acceptée à la compilation1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
L'encapsulation consiste à faire en sorte que l'utilisateur de la classe n'ai pas d'accès au "détails d'implémentation" de celle-ci... qu'en penses-tu2 – La notion d’encapsulation au sens C++ est – elle présente dans cette classe ? Justifiez dans les 2 cas (oui ou non) votre réponse. Au cas où il n’y a pas d’encapsulation dans cette classe, proposez la mise en oeuvre de cette notion au sein de cette classe.
Quelle horreur... justement pas...
Tu peux définir une fonction (qui sera considérée implicitement comme inline) directement au sein de la définition de la classe sans préciser que... tu définis effectivement une fonction membre de la classe...
Mais le fait que la fonction soit implicitement considérée comme inline place certaines restrictions (entre autres au niveau des fonctions virtuelles)
C'est lorsque, justement, tu ne définis pas les fonctions membres au sein de la définition de la classe que tu dois préciser la portée complete sous la forme de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <type de retour> <nom de la classe>::<nom de la fonction>(<liste d'arguments>) <cv-qualifier de la fonction> { <corps de la fonction> }encore une fois NON...3)On peut hériter de n'importe quel classe donc cette classe peut être une classe de base dans le cas de l'héritage sauf que pour les classes vraiment de base on utilise plus des classe abstraite
du moins, pas dans l'optique d'un héritage public, avec la notion polymorphe qu'il entraine.
En effet, si tu a le malheur de faire passer un objet de la classe dérivée pour la classe de base telle qu'elle est décrite ici et de détruire l'objet en question, seul le destructeur de la classe de base sera appelé, les membres propres aux classes dérivées ne seront donc pas détruit, et tu t'orientes tout droit vers... de fantastiques fuites mémoire... dans le meilleur des cas.
En effet, lorsque le compilateur ne rencontre pas de déclaration du constructeur, il en place un "par défaut" qui
- est public
- est inline
- est non virtuel
- appelle le destructeur des membres dans l'ordre inverse de leur déclaration
Un tel destructeur ne respecte pas le minimum requis pour une utilisation polymorphe
Là aussi, j'ai l'impression que tu t'es trompé de langage...6)Pour que la classe devienne abstraite on met dans la declaration apès le nom de la classe abstract et on definit aucune methode et on ajoute virtual avant le type de retour des methodes pour les attributs ils doivent etre protected pour permettre leur heritage. Cela implique qu'on ne peut pas instancier d'objet directement de cette classe elle est utilisée seulement comme classe de base pour d'autre classe
Le mot clé abstract n'existe pas en C++
Pour qu'une classe soit considérée comme abstraite, il "suffit" qu'une des fonctions membres soit virtuelle pure.
Toute classe dérivant d'une classe abstraite et ne redéfinissant pas la fonction virtuelle pure sera elle aussi considérée comme une classe abstraite
Partager