1

クラスへのポインタを指定して、実装をラップしている別のクラスにキャストする方法を dynamic_cast<>() に指示できるように、C++でクラスを構築する方法はありますか? オペレーターキャストはトリックを行いますか? Abstract インターフェース基本クラスがあり、concreteB だけでなく、これから concreteA を派生させますが、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);
}
4

1 に答える 1

4

いいえ。動的キャストは、コンパイラに「このオブジェクトをまったく変更したくないので、別の型であるかのように見たいだけですが、変更しないでください」と伝えています。変更するか、NULL を返すか、例外をスローしてください。」動的キャストは、ユーザーに代わってそのような変換を実行しようとはしません。そのためには、 または が必要static_castですboost::lexical_cast

これは、キャスト演算子が次のいずれかを実行できるためです。

  • 既存のオブジェクトを変更せずに新しい方法で再解釈する
  • int -> short、または double -> int など、オブジェクトを別の型に強制するために、何らかの方法でオブジェクトを変更します。

1 回のキャスト呼び出しでは、これらのいずれかのみを実行できます。両方を実行することはできません

キャスト演算子の「二重」の性質の詳細については、Eric Lippert によるこの記事を参照してください。この記事は C# を対象としていますが、ほとんどが C++ にも適用されます。

具体的には、最新の C++0x ドラフトの § 5.2.7 を見ることができます。その動作は C++03 から変更されていません。

于 2010-08-10T21:46:54.690 に答える