【问题标题】:Can I teach dynamic_cast<>() new tricks?我可以教 dynamic_cast<>() 新技巧吗?
【发布时间】:2010-08-10 21:21:41
【问题描述】:

在 C++ 中有没有一种方法来构造你的类,这样给定一个指向你的类的指针,你可以指示 dynamic_cast() 如何转换到另一个你正在为其包装实现的类?运营商演员会成功吗?想象一下,我有一个抽象接口基类,并从中派生了一个具体A 以及具体B,但是具体B 将接口包装到一个具体A 类型的对象。如果我收到从具体A 转换为具体A 的请求,我希望它能够工作:

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);
}

【问题讨论】:

    标签: c++ abstract-class dynamic-cast concrete


    【解决方案1】:

    没有。动态转换告诉编译器“我根本不想改变这个对象,我只是想试着把它看作是另一种类型,但不要改变它。如果你必须改变它,返回 NULL 或抛出异常。”。动态转换不会尝试代表您执行任何此类转换。为此,您需要static_castboost::lexical_cast

    这是因为转换运算符可以:

    • 以新的方式重新解释现有对象而不更改它
    • 以某种方式更改对象以将其强制为另一种类型,例如 int -> short 或 double -> int。

    并且一次强制转换只能执行其中一个,不能同时执行。

    有关强制转换运算符的“双重”性质的更多信息,您可以查看this article by Eric Lippert,它针对 C#,但也主要适用于 C++。

    具体来说,您可以在最新的 C++0x 草案中看到第 5.2.7 节——该行为与 C++03 相比没有改变。

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2010-10-13
      • 2011-07-18
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多