Pourquoi il est déconseillé d'hériter de std::string
Dans Effective C , l'accent est mis sur le fait qu'un virtuel Le destructeur est crucial pour la capacité d’une classe à présenter un comportement polymorphe. L'absence de destructeur virtuel dans std::string interdit donc effectivement d'en dériver. Cela nous amène à la question : quels critères supplémentaires une classe doit-elle remplir pour être considérée comme une classe de base appropriée ?
Éligibilité au statut de classe de base
Contrairement à l'hypothèse implicite dans la question, une classe n'a pas besoin de prendre en charge le polymorphisme pour servir de classe de base. L'héritage en C répond à deux objectifs principaux :
std::string comme classe de base
La raison va au-delà de l'absence d'un destructeur virtuel. std::string n'a jamais été destiné à fonctionner comme une classe de base, polymorphe ou autre. Cela peut être attribué aux propriétés des classes en C.
Contrairement à d'autres langages orientés objet où les classes sont des types référence, C traite les classes comme des types valeur. Par conséquent, lorsqu’un objet de classe de base est copié, seuls ses membres sont copiés, et non ceux des classes dérivées. Ce phénomène, connu sous le nom de problème de découpage, peut entraîner des incohérences et des comportements erronés.
Ainsi, plutôt que d'implémenter l'héritage pour l'extension de méthode, il est considéré comme une bonne pratique en C d'utiliser des fonctions non amies et non membres. ou composition. L'héritage doit être réservé à la métaprogrammation de modèles ou à l'établissement d'un comportement polymorphe.
Prévenir l'héritage non polymorphe
Dans les cas où une classe de base est destinée uniquement à la réutilisabilité du code, il existe aucun moyen efficace pour empêcher la création de pointeurs vers des classes dérivées. Cependant, l'utilisation de l'héritage privé, la restriction de l'accès aux méthodes de classe dérivées et l'évitement des méthodes de classe de base publiques peuvent décourager leur utilisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!