disons que j'ai les classes suivantes: comme vous le voyez en raison de mon type de déclaration de fonction quelle est la bonne façon de le faire? p> Une possibilité serait de laisser les arguments comme ils sont utilisés pour être dans le sinon, ne faites pas de dérivation de B code> et c code> hériter de A Code> et dériveClass1 code> et dérivéclass2 code> hérit de BASECLASS code>. p> Dummy () code> n'est pas autorisé, car les arguments ont changé, même si B code> et c code> sont dérivés de A code>. < / p> basoclass code> et juste faire Casting après dans la fonction mannequin code>, mais je suppose que ce n'est pas vraiment sympa. p> mannequin code> (et retirez-le de basoclass code>), donc les deux classes dérivéclass1 code> et dérivéclass2 code> les déclarent indépendamment. Mais alors l'idée de toutes les classes dérivées de basoclass code> doit mettre en œuvre du mannequin disparut. P> p>
4 Réponses :
Tout d'abord, lorsque vous déclarez que quelque chose Si vous souhaitez instancier si a code> est une classe de base de B code> ou C code>, vous le faites avec l'intention que < Code> B code> et C code> avoir toutes les propriétés de A code> et que vous pouvez utiliser B code> et c code > Dans n'importe quel endroit que vous pouvez utiliser A code> in. Un bon design fournit souvent une définition significative de A code> qui permet une définition générique de mannequin code> Pour toutes les spécialisations de A code>. En ce sens, le problème peut être moins courant que vous ne pouvez vous attendre. dériveClass1 code> ou dériveClass2 code>, votre notion de dérivéclass1 Code> et dérivéClass2 code> n'a pas vraiment de sens, car pour que soit em> a basoclass code>, ils doivent fournir une définition significative de Vide mannequin (a * a) code>. Vous devez fournir cette définition. Ils peuvent fournir des méthodes em> em> factice vides (B * B) code> ou mannequin vide (C * C) code>, mais ceux-ci ne sont utilisés que si la statique Type de BASECLASS code> dériveClass1 code> ou dériveClass2 code>. p> dériveClass1 < Code> DeriveClass2 Code> doit distinguer entre B code> et C code>, cela pourrait être un signe de mauvaise conception. Mais cela pourrait également être une décision bien informée. Généralement, vous avez besoin d'un moyen d'expédier dynamiquement à la bonne méthode. Par exemple, cela pourrait être atteint comme celui-ci: p>
Les classes découlant d'une classe abstraite mettent souvent la mise en œuvre de virtuelles pures, mais elles ne sont nullement nécessaires pour le faire. Votre deuxième paragraphe suggère que ce serait le cas.
@ idclev463035818 Fonctions virtuelles pure sont b> requises pour être remplacées dans une sous-classe non abstraite. Je pense que les gens sont descendus Markus sur une technicité.
@ idclev463035818 aussi, 463035818 code> n'est pas un numéro de carte IDCLEV valide: p
@Dai sur une sous-classe non abstraite Oui, mais ce n'est pas ce qui est écrit sur ce deuxième paragraphe. Je ne sais pas pourquoi les autres vote, je viens de montrer quelque chose que je pense est une désinformation
@Dai l'avez-vous essayé?
@ idclev463035818 Vous avez raison, bien sûr. J'ai fait l'hypothèse que OP souhaitait instancier DeriveClass1 ou 2 et ceux qui étaient censés être non abstraits. Édité ma réponse pour la clarté.
@ idclev463035818 Je l'ai essayé dans un port WebAssembly non officiel de Doom 2 et rien ne s'est passé :(
@Dai quelle pitty: p. Je ne suis pas content de l'espace de mon pseudo, car Afair pour la triche pour travailler, il n'y avait pas d'espace autorisé, mais je ne voulais plus le changer quand je l'ai réalisé. Désolé d'aller un peu offtopic ...
En raison de ma compréhension, ce type de déclaration de fonction factice () n'est pas autorisé p> blockQuote>
Techniquement, les déclarations indiquées de
mannequin code> sont autorisées. Il se peut toutefois que vous espériez que les enfants soient concrets, ce qui n'est pas le cas. P>Sinon, ne faites pas de dérivation de mannequin (et retirez-le de la base de base), de sorte que les deux classes dérivéClass1 et dériveClass2 leur déclarent indépendamment. P> blockQuote>
Cette approche a du sens. P>
Mais alors l'idée de toutes les classes dérivées de la base de base doit mettre en œuvre du mannequin disparut. P> blockQuote>
Ceci est simplement une idée qui ne peut pas être exprimée avec héritage d'une classe de base. Il n'y a pas de concept de "enfant implémente une fonction membre avec certains em> argument". Le type d'argument doit être connu et tous les enfants doivent accepter tous les arguments que la base accepte. Et cela n'est pas rempli par votre hiérarchie, les enfants restent donc abstraits. P>
La structure que vous recherchez semble plutôt être concept em>. C ++ 20 introduira une manière programmatique de spécification de concepts; Jusque-là, les concepts sont implicites: Si vous écrivez un modèle, vous pouvez spécifier qu'un argument de type doit satisfaire à l'exigence d'une fonction de membre
mannequin code>. Les deux types "dérivés" satisferaient ce concept. P>
Le point de héritage virtuel est que vous pouvez appeler vos classes dérivées via une référence / un pointeur sur le type de base:
void DerivedClass1::dummy(A* a) {
if (B* const b = dynamic_cast<B*>(a)) {
/* do stuff with b */
} else {
/* error handling -> wrong runtime type */
}
}
C ++ n'est pas en mesure de gérer votre situation car il n'ya aucun moyen de mettre une telle contrainte sur les appels de fonction par la classe de base. Mais la modification du type de fonction virtuelle peut être effectuée par exemple pour des types retournés, voir Covariance et Contravarariance :
Quelle est exactement votre question?
Ce n'est pas ce que l'héritage est pour. Si vous avez
basoclass * code> quelque part et que vous souhaitez appelermannequin code>, comment savez-vous quel argument devriez-vous passer?a * code>?b * code>?c * code>? Vous devriez repenser votre conception.DUMMY () CODE> INDERIVECLASS1 CODE> etDERIVECLASS2 CODE> Sont surcharges (et ils sont autorisés). Un mannequin annuel(A *); code> seraitremplacer code>.Considérant la conception de ce que je vois: je pense que ce serait mieux, si la classe de base implémente un membre de
A code> et la classe dérivée crée un type correspondant. Le mannequin est ensuite appelé sans paramètre et peut faire les choses nécessaires. Peut-être que si vous donnez plus de détails, nous pouvons discuter d'une "bonne" solutionJ'ai fait un exemple de ce que l'effet serait si vous avez réalisé votre
DeriveClass code> ES concret (au lieu d'abstrait comme ils sont maintenant): iciCela ne pourrait-il pas être résolu en faisant
basoclass code> un modèle oùa code> est un argument de type de modèle? (Accordé, vous devez utiliser C ++ 2X pour permettre l'utilisation des contraintes d'argument de type si vous souhaitez vous assurer queT: A code>).