Question

Est-il possible en C ++ pour construire votre classe telle que donnée un pointeur vers votre classe, vous pouvez demander dynamic_cast <> () comment lancer à une autre classe pour laquelle vous envelopper la mise en œuvre? Would opérateur cast faire l'affaire? Imaginez que j'ai une classe de base d'interface abstraite et tire un concreteA de ce ainsi que concreteB, mais concreteB enveloppe l'interface à un objet de type concreteA. Si je reçois une demande de caster concreteA de concreteA, je voudrais que ce travail:

class Abstract {
public:
  virtual void interface() = 0;

};

class concreteA : public Abstract {
public:
  virtual void interface();

};

class concreteB : public Abstract {
public:
  concreteB(concreteA &underlying)
    : _underlying(&underlying) {
  }
  virtual void interface();

  operator concreteA*() {
    return _underlying;
  }

private:
  concreteA *_underlying;

};

void
myTest() {
  concreteA myClassA;
  concreteB myClassB(myClassA);
  Abstract *abstract = &myClassB;
  concreteA *underlying = dynamic_cast<concreteA *>(abstract);
}
Était-ce utile?

La solution

Non

. Si vous devez changer un casting de dynamique est dit au compilateur « Je ne veux pas changer cet objet du tout, je veux juste essayer de le regarder comme si elle était cet autre type, mais ne changent pas. , retour NULL ou lancer une exception. ». Dynamic cast ne va pas tenter d'effectuer de telles conversions en votre nom. Pour cela, vous avez besoin static_cast ou boost::lexical_cast.

En effet, l'opérateur de cast pouvez:

  • Réinterpréter un objet existant dans une nouvelle façon sans le modifier
  • Modifier un objet d'une certaine façon afin de le contraindre à être un autre type, comme int -> court ou double -.> Int

et un seul appel de fonte ne peut faire un de ceux-ci, pas les deux.

Pour plus d'informations sur la nature « double » de l'opérateur de distribution, vous pouvez voir cet article par Eric Lippert , qui vise à C #, mais applique surtout aux C ++ ainsi.

Plus précisément, vous pouvez voir § 5.2.7 dans le plus récent C ++ 0x projet - que le comportement ne change pas de C ++ 03

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top