Merci pour vos contributions.
Si vous me le permettez, je vais essayer d'exposer un peu plus précisément mon héritage actuel. Je trouve que parler de notions abstraites sur des exemples abstraits, ca commence à manquer un peu de concret ;)
Et avec cela, j'espère que vous pourrez me dire déjà si mon héritage a un problème, et si non, me donner quelques solutions à toutes ces abstractions.
Je manipule des points, de la notion toute simple qu'on admet habituellement à des entités bien plus précises. En résumé, j'ai créé 6 classes de points. J'ai donc mis en place le système d'héritage dont il est question, pour matérialiser le tout, car bien entendu, toutes ces classes ont certaines similitudes.
J'ai donc:
Point 1.1/Point 0
\Point 1.2 - Point 2.1\Point 2.2 - Point 3
* La classe Point 0 contient les attributs de base pour un point, à savoir X, Y et Z. Celle-ci ne doit pas être abstraite, des points très simples doivent pouvoir être créés.
* Point 1.1 hérite de Point 0, et rajoute quelques attributs basiques. Elle doit également être instanciable.
* Point 1.2 hérite de Point 0, et correspond à la classe Mere présentée plus haut. En partant d'un point simple, elle ajoute de nombreux attributs de base, communs à ses classes filles. La classe en elle-même correspond effectivement à une notion plutôt abstraite, car il n'y a pas d'objet Point 1.2 à proprement parler, uniquement des Points 2.1 et Points 2.2.
:question: Cependant, comme elle hérite de Point 0, qui n'est pas abstraite, est-ce possible "d'intercaler" dans un héritage une classe abstraite au milieu d'autres qui ne le sont pas?
* Les classes 2.1 et 2.2 sont des particularités de 1.2, en quelque sorte, 2 types de points qui se basent sur 1.2. Ce sont ces dernières qui sont le plus utilisées, instanciées, etc... et qui doivent être stockées dans une map, ensemble. Elles étaient nommées Fille1 et Fille2.
* Finalement, la classe Point 3 est une spécialisation de Point 2.2, objet du même "type" mais avec quelques particularités. Elle doit également être instanciée, objets contenus dans une map. Elle correspond à Fille1.1 plus haut.
Voilà donc mon héritage. Tous les attributs des classes sont des types de la STL: int, double, bool et string. Ces différentes classes sont utilisées à travers des fonctions placées dans des namespaces, hors des classes, passées le plus souvent en référence constante.
:question: Voyez-vous un accroc dans mon système d'héritage?
Ou est-ce qu'a priori, il devrait pouvoir fonctionner?
:question: Ce qu'il faudrait donc que je fasse, c'est rendre ma classe Point 1.2 abstraite?
Et donc d'y placer des fonctions virtuelles, sans implémentation, uniquement avec = 0 à la fin de la déclaration?
TOUTES ces fonctions virtuelles seraient alors implémentées dans chacune des classes Point 2.1 et Point 2.2 pour renvoyer ce qu'il faut et les rendre "pas abstraites" (instanciables)?
Tout cela n'impactant pas Point 3?
Et pour finir il faudra également créer des destructeurs virtuels dans Point 1.2, 2.1 et 2.2?
Et laisser leur implémentation vide, puisque seuls des types courants sont utilisés pour leurs attributs, aucun pointeur?Code:
1
2
3
4
5
6
7
8 Point1.2.hpp virtual ~Point1.2(); Point2.1.hpp virtual ~Point2.1(); Point2.2.hpp virtual ~Point2.2();
:question: Avec cela, mon code est-il un peu plus correct?Code:
1
2
3
4
5
6
7
8 Point1.2.cpp ~Point1.2(){} Point2.1.cpp ~Point2.1(){} Point2.2.cpp ~Point2.2(){}