我可以教flow_cast<>()新技巧吗?

时间:2010-08-10 21:21:41

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

在C ++中是否有一种方法可以构建你的类,以便给定一个指向你的类的指针,你可以指示dynamic_cast<>()如何转换到你正在包装实现的另一个类?操作员演员会这样做吗?想象一下,我有一个抽象接口基类,并从此派生一个concreteA以及concreteB,但concreteB将接口包装到concreteA类型的对象。如果我收到从concreteA转发到concreteA的请求,我希望它可以工作:

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

1 个答案:

答案 0 :(得分:4)

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

这是因为演员操作员可以:

  • 以新方式重新解释现有对象而不更改它
  • 以某种方式更改对象以将其强制为另一种类型,例如int - &gt;短,或双 - &gt;中间体

并且单个演员调用只能执行一个,而不是两者。

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

具体来说,您可以在最新的C ++ 0x草案中看到§5.2.7 - 该行为不会从C ++ 03中更改。