Au fait, tu as Chroma Medical Systems remarqué qu'en C# aussi, les méthodes ne sont pas virtuelles par défaut ? :-)
Oui et c'est à mon avis l'un des seuls défauts du langage. La sémantique de l'héritage est d'ailleurs assez complexe par rapport à Java et je ne la trouve pas très convainquante. Si tu as un exemple de l'utilité pratique du bousin, je suis preneur.
Par contre, il n'y a pas de changement de sémantique suivant le mode de passage qui rend le C++ inconsistant. Je n'ai d'ailleurs surement pas assez insisté sur ce point : je trouve idiot d'avoir à ajouter virtual, mais c'est surtout une question de goût. Cela pose aussi des problèmes de génie logiciel : le concepteur d'une classe doit explicitement rendre ces méthodes modifiables et doit donc penser aux extensions possibles, ce qui est beaucoup plus dur que de penser aux méthodes qui ne doivent surtout pas être modifiées. Je trouve donc que le final de Java est plus utile, mais je ne me battrais par pour ça.
Ce qui pose vraiment problème en C++ et qui est une erreur de conception à mon avis, c'est que le comportement des méthodes d'un objet dépend du mode de passage de celui-ci. De plus, il n'y a pas de garde fous en C++, alors que c'est le cas en C# (tu ne peux redéfinir une méthode non virtual que si tu le demandes de façon très explicite en ajoutant un new).
[^] # Re: C'est un troll.
Posté par boubou . En réponse à la dépêche Mono 1.0 sous le feu des projecteurs. Évalué à 3.
Oui et c'est à mon avis l'un des seuls défauts du langage. La sémantique de l'héritage est d'ailleurs assez complexe par rapport à Java et je ne la trouve pas très convainquante. Si tu as un exemple de l'utilité pratique du bousin, je suis preneur.
Par contre, il n'y a pas de changement de sémantique suivant le mode de passage qui rend le C++ inconsistant. Je n'ai d'ailleurs surement pas assez insisté sur ce point : je trouve idiot d'avoir à ajouter virtual, mais c'est surtout une question de goût. Cela pose aussi des problèmes de génie logiciel : le concepteur d'une classe doit explicitement rendre ces méthodes modifiables et doit donc penser aux extensions possibles, ce qui est beaucoup plus dur que de penser aux méthodes qui ne doivent surtout pas être modifiées. Je trouve donc que le final de Java est plus utile, mais je ne me battrais par pour ça.
Ce qui pose vraiment problème en C++ et qui est une erreur de conception à mon avis, c'est que le comportement des méthodes d'un objet dépend du mode de passage de celui-ci. De plus, il n'y a pas de garde fous en C++, alors que c'est le cas en C# (tu ne peux redéfinir une méthode non virtual que si tu le demandes de façon très explicite en ajoutant un new).