J'ai un problème où je n'ai que de hériter de la classe de base une fois. Après cela, je veux arrêter quiconque de hériter de cette classe. Quelqu'un peut-il m'expliquer comment cela peut être atteint. De plus, si le nombre de fois la classe de base est hérité de N fois (par exemple, 1 ..10) Quelle sera la façon générique de le faire. p>
Je sais que l'utilisation de la classe d'amis dans la classe de base peut résoudre mon problème dans une certaine mesure. Mais je trouve cela pour être maladroite.Aussi j'ai lu sur Restreindre l'héritage au nombre de classes souhaité à la compilée - heure . Je n'ai pas pu comprendre complètement la réponse. p>
Quelqu'un peut-il me suggérer de mieux moyens de restreindre l'héritage au moment de la compilation en C ++. P>
3 Réponses :
J'ai un problème où je n'ai que de hériter de la classe de base une fois. Après cela, je veux arrêter quiconque de hériter de cette classe. p>
Depuis C ++ 11, vous pouvez simplement utiliser
final code> pour empêcher une classe d'être sous-classée: P>class BaseClass { }; class DoNotInheritClass final : public BaseClass { };
J'ai besoin d'hériter d'une fois de classe de base une fois. Par conséquent, cela ne vous aiderait pas. Cela ne permettrait à personne d'hériter de la classe de base même une fois.
Vous voulez donc hériter de basoclass code> une seule fois, et pas plus loin, non?
Non .. De plus, je veux que ce soit générique comme mentionné en question. Disons que je veux que la classe de base soit hérité de deux fois ou trois fois alors quelle serait l'approche
Voir cette réponse, puis Stackoverflow.com/questions/ 772655 / ...
La classe de base actuellement héritée une fois par équipe interne. Maintenant, cette classe est disponible pour une tierce partie. Cependant, je ne veux pas qu'ils héritent de cette classe de base. Il s'agit donc de la déclaration de problème p>
Le problème est que C ++ ne fournit aucun moyen de restreindre la succession de manière directement. p>
Pointeur à la mise en œuvre Idiom pourrait vous aider à se déplacer de toute façon: P>
class PublicToUser final { class PrivateToUser; std::unique_ptr<PrivateToUser> implementation; public: // *** };
Voici quelques idées qui pourraient aider si vous ne pouvez pas utiliser la solution PIMPL de l'autre réponse. Ils sont soit basés sur CRTP, soit sur le marquage du constructeur:
int main(){
auto a = A{};
auto a2 = A2{};
auto a3 = A3{}; // fails
return 0;
}
Je trouve la profondeur de l'arbre d'héritage pour être un obstacle majeur pour comprendre une classe. Bon sur vous pour demander comment le limiter.
@MarkRansom de ce que je peux dire, OP vous demande comment limiter la largeur de l'arbre d'héritage, pas sa profondeur.
Oui, je veux limiter la largeur de l'arbre d'héritage.
Vous avez vraiment besoin d'autoriser un certain nombre de classes dérivées inconnues? Ou vous devez empêcher les classes dérivées supplémentaires qui ne sont pas dans la mise en œuvre envisagée spécifique? Pouvez-vous dire un peu pourquoi? Cela ressemble à un problème X-y; Il peut y avoir de meilleurs moyens de protéger quels que soient des classes dérivées supplémentaires pourraient poser.
Actuellement, la classe de base est héritée une fois par équipe interne. Maintenant, cette classe est disponible pour une tierce partie. Cependant, je ne veux pas qu'ils héritent de cette classe de base. Donc c'est la déclaration de problème
Est-ce que vous dérangez des appelants ayant accès à son une interface virtuelle pure i>? Est-ce juste la fonctionnalité / la mise en œuvre que vous souhaitez limiter?
#Galik non, je ne voudrais pas que les appelants aient accès à une interface virtuelle pure
"De plus, ça irait bien s'il peut restreindre l'héritage au moment de l'exécution." I> Que voulez-vous dire? Nous ne pouvons pas créer de classe / hiérarchie au runtime ...
Cela ressemble à une mauvaise fonctionnalité. Documentez ce que votre classe fait et comment il est destiné à être utilisé. Si quelqu'un l'informe que c'est leur problème, pas le vôtre.
Veuillez fournir un claire MCVE (et un très brèves exemple de ce que vous faites actuellement et de ce que vous voulez prévenir). Comme il se trouve, vos questions sont plutôt déroutantes et peu claires, alors responsables de la fermeture.
@ Jarod42 c'était du lien que j'ai partagé. En tout cas j'ai enlevé la ligne.