Pourquoi je ne peux pas hériter de int en C++?

J'aimerais être capable de faire cela:

class myInt : public int
{

};

Pourquoi ne puis-je pas?

Pourquoi voudrais-je? Plus de la frappe. Par exemple, j'ai pu définir deux classes intA et intB, qui m'a laissé faire intA + intA ou intB + intB, mais pas intA + intB.

"Ints ne sont pas des classes." Et alors?

"Ints n'ont pas de données sur les membres." Oui, ils le font, ils ont 32 bits, ou quoi que ce soit.

"Ints n'ont pas de fonctions membres." Eh bien, ils ont tout un tas d'opérateurs comme + et -.

  • Parce que la langue n'a pas été conçu de cette façon.
  • Les langages tels que C# vous permettent d'ajouter des "méthodes d'extension" pour les classes (et à peu près tout, y compris ints, sont des classes), généralement utilisé pour le format en chaînes ou ce que vous avez. Bien sûr, ce n'est pas jive avec la presque-nu-métal C++ modèle.
  • Je pense que Neil commentaire cloué vers le bas. C'était une décision de conception pour ne pas faire de types primitifs classes. Il y a de bonnes raisons de le faire et de bonnes raisons contre. Comme tout dans le C++, cela, aussi, est justifiée par l'objectif de quasi-optimale de la performance.
  • Bien que j'ai apprécié de Neil réponse, il n'a probablement pas faire beaucoup pour éduquer OP. Rappelle moi (n'en déplaise) de l'ingénierie de manuels scolaires: si vous ne l'avez pas déjà comprendre le sujet, l'explication est inutile. Puis de nouveau, j'ai eu un bon rire...
  • "Ints ne sont pas des classes" alors? l'Héritage, le polymorphisme et l'encapsulation sont les clés de voûte de la conception orientée objet. Aucune de ces choses s'appliquent à ordinale types. Vous ne pouvez pas hériter d'un int, parce que c'est juste un tas d'octets et n'a pas de code. Il n'a pas une méthode de la table, donc il n'y a aucun moyen d'ajouter des méthodes ou de les remplacer.
  • Comme pour les "Pourquoi voudrais-je? Plus de la frappe. Par exemple, j'ai pu définir deux classes de l'intA et intB, qui permettez-moi de faire l'intA+intA ou intB+intB, mais pas l'intA+intB", c'est absurde. Vous pouvez mettre en œuvre ces types sans hériter de int. Il suffit de définir un nouveau type à partir de zéro, et de définir ses operator+. Je ne vois pas le problème
  • Si votre syntaxe est légal, alors intA+intB serait de compiler, ce qui était ce que l'on voulait éviter.
  • Downvoted parce que l'OP est belligérants. La question a été répondu de manière adéquate. @Neil réponse est le meilleur: la langue n'a tout simplement pas travailler de cette façon. L'OP doit le laisser aller.
  • Que faire si vous voulez toutes les opérations entiers de soutien? Assurément, il n'est pas beaucoup de joie à les mettre en œuvre pour l'intA, puis la même chose pour intB, etc. etc.
  • Mais UncleBens, il y a la faille. Si vous voulez de type sécurisé opérateurs qui ne fonctionnent pas sur tous les types int, mais seulement à certains, vous allez avoir à re-mettre en œuvre tous les opérateurs de toute façon. Vous n'avez pas sauver quoi que ce soit en descendant à partir de quelque chose qui a déjà les opérateurs. Et si vous ne voulez que les opérateurs de travailler sur tous les types int, alors vous devriez utiliser int.
  • Il peut ne pas être beaucoup de joie, mais il est nécessaire, parce que l'ensemble de la prémisse de la question est de je ne veux pas de ce type de travail dans un contexte où int est prévu. Il ne peut pas réutiliser tout int opérateurs, car cela permettrait à la chose exacte que l'OP voulait éviter.
  • Cela ne signifie pas encore que l'on doit l'accepter, et ne pas se demander s'il pourrait y avoir différents, mais générique et réutilisable solutions.
  • Ne pas hériter de int pour but de faire dégénérer les classes qui violent LSP? Quel est le problème avec la création d'une nouvelle classe avec ints et les opérateurs de membres?
  • Accepter quoi? L'OP propose une fonctionnalité qui, même si elle était possible, ne permettrait pas de réaliser ce qu'il a réellement envie de faire. Avant que vous pouvez blâmer la langue pour ne pas l'appui de sa fonction, il est utile de considérer que le dispositif serait effectivement de résoudre son problème. Dans ce cas, il ne serait pas.
  • Non, @David, il n'en a pas. Il lui a fallu un certain temps pour enfin comprendre à quelle question il vraiment envie de demander, mais dans son deuxième commentaire à votre réponse, enfin, il a précisé qu'il. (Je vois que beaucoup de choses en question "pourquoi", où une personne a de la difficulté à exprimer ce qu'il veut savoir la justification d'une décision de conception plutôt que le chapitre et le verset qui dit que quelque chose est ou n'est pas autorisée.) Je ne vois aucune preuve qu'il rejetait les réponses à ses qui n'est pas encore finalisé question juste pour embêter les gens.
  • bon point bon point de vue.
  • Vous devriez changer le titre de votre question ce que vous cherchez n'est pas hériter de type int, mais avoir un autre type.
  • Je suis content que cette question a obtenu les gens à parler et beaucoup de réflexion à ce sujet. Je pense que c'est une de ces questions que beaucoup de gens pensent qu'ils connaissent la réponse, mais quand il s'agit de formuler cette réponse, le mieux qu'ils viennent avec est: "Juste parce que". I. E. "je ne sais pas".
  • Pourquoi aurait-on à faire un tel héritage? typedef int CostumerId; typedef int ProductId; Costumer getCostumer(CostumerId cid); ProductId pid = 10; Costumer c = getCostumer(pid); // mistake allowed!! si c'était class CostumerId: int {}; and class ProductId: int {}; il ne serait pas autorisé. Si je viens de composer CostumerId { int id; } je vais avoir de la surcharge de tous les opérateurs pour obtenir la pleine fonctionnalité, comme (pid++ == ++pid || pid != pid--).
  • nope, class ProductId { ... int i; public: operator int() {return i;} ...}; va créer un nouveau, de différent objet temporaire. Vous ne pouvez toujours pas faire ProductId pid; .... pid++; -- vous avez encore besoin de surcharger l'opérateur++ pour compiler. S'il était possible d'hériter de int, tous ceux de l'opérateur primordial serait donnée pour gratuit.
  • oups, vous avez raison, la suppression de mon commentaire précédent

InformationsquelleAutor Rocketmagnet | 2010-01-26