Il y a un certain nombre de raisons pour lesquelles ce une mauvaise idée.
Tout d'abord, c'est une mauvaise idée parce que les conteneurs standard n'ont pas de virtuel destructeurs. Vous ne devez jamais utiliser quelque chose polymorphically qui n'ont pas les destructeurs virtuels, parce que vous ne pouvez pas garantir de nettoyage dans votre classe dérivée.
Règles de base pour virtuel dtors
Deuxièmement, il est vraiment une mauvaise conception. Et il y a en fait plusieurs raisons, il est un mauvais design. Tout d'abord, vous devriez toujours étendre les fonctionnalités de conteneurs standard grâce à des algorithmes qui fonctionnent de façon générique. C'est simple, la complexité de la raison - si vous devez écrire un algorithme pour chaque conteneur, il s'applique et vous avez M conteneurs et N algorithmes, c'est à dire M x N méthodes que vous devez écrire. Si vous écrivez votre algorithmes de façon générique, vous avez N algorithmes seulement. Ainsi, vous obtenez beaucoup plus de les réutiliser.
Il est aussi vraiment mauvaise conception parce que vous êtes briser une bonne encapsulation en héritant du conteneur. Une bonne règle de base est: si vous pouvez accomplir ce que vous avez besoin de l'aide de l'interface publique d'un type, faire de ce nouveau comportement externe du type. Cela améliore l'encapsulation. Si c'est un nouveau comportement que vous souhaitez mettre en œuvre, d'en faire un espace de noms de la portée de la fonction (comme les algorithmes). Si vous avez un nouvel invariant d'imposer, à l'utilisation de confinement dans une classe.
Un classique de la description de l'encapsulation
Enfin, en général, vous ne devriez jamais penser à propos de l'héritage comme un moyen d'étendre le comportement d'une classe. C'est l'un des grand méchant mensonges de début de la programmation orientée objet de la théorie qui est lié à un manque de réflexion sur la réutilisation, et elle continue à être enseignée et promu à ce jour, même si il est clair que la théorie de pourquoi c'est mauvais. Lorsque vous utiliser l'héritage pour étendre comportement, vous êtes liant cette étendue comportement de l'interface du contrat d'une manière qui lie les utilisateurs mains à de futurs changements. Par exemple, disons que vous avez une classe de type Socket qui communique à l'aide du protocole TCP et vous étendre son comportement par la dérivation d'une classe SSLSocket de Prise et de mise en œuvre le comportement du supérieur SSL pile de protocole sur le dessus de la Prise. Maintenant, disons que vous obtenez une nouvelle obligation d'avoir le même protocole de communication, mais sur une ligne d'USB, ou sur la téléphonie. Vous auriez besoin de couper et coller tout ce qui travailler à une nouvelle classe qui dérive d'une classe d'USB, ou un service de la Téléphonie classe. Et maintenant, si vous trouvez un bug, vous devez le résoudre dans les trois lieux, ce qui n'est pas toujours le cas, ce qui signifie que les bogues de prendre plus de temps et pas toujours fixe...
C'est le général de toute hiérarchie d'héritage A->B->C->... Lorsque vous souhaitez utiliser les comportements que vous avez étendu dans les classes dérivées, comme B, C, .. sur les objets qui ne sont pas de la classe de base, vous avez la refonte ou vous êtes à la duplication de mise en œuvre. Cela conduit à de très monolithique des dessins qui sont très difficiles à modifier en bas de la route (pensez à Microsoft MFC, ou leur .NET, ou bien, ils font cette erreur d'un lot). Au lieu de cela, vous devriez toujours penser à l'extension au travers de la composition à chaque fois que possible. L'héritage doit être utilisé lorsque vous pensez "Ouvert / Fermé Principe". Vous devriez avoir les classes de base abstraites et dynamique polymorphisme d'exécution à travers hérité de la classe, chacun sera pleinement mise en œuvre. Les hiérarchies ne devrait pas l'être profond presque toujours à deux niveaux. Seule l'utilisation de plus de deux lorsque vous avez différents dynamique de catégories que d'aller à une variété de fonctions qui ont besoin de cette distinction pour le type de sécurité. Dans ces cas, l'utilisation résumé des bases jusqu'à ce que la feuille de classes, dont la mise en œuvre.