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

Wil*_*mKF 1 c++ abstract-class dynamic-cast concrete

C++ 中有没有一种方法可以构造您的类,以便给定一个指向您的类的指针,您可以指示dynamic_cast<>() 如何转换为您要包装其实现的另一个类?运算符强制转换可以解决问题吗?想象一下,我有一个抽象接口基类,并从中派生出一个creteA和一个concreteB,但concreteB将该接口包装到一个concreteA类型的对象。如果我收到从creteA转换为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);
}
Run Code Online (Sandbox Code Playgroud)

Bil*_*eal 5

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

\n

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

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

并且单个强制转换调用只能执行其中一项,而不能同时执行两项。

\n

有关强制转换运算符“对偶”性质的更多信息,您可以参阅Eric Lippert 的这篇文章,该文章针对 C#,但也主要适用于 C++。

\n

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

\n