2

これがシナリオです:

class Base {
public:
  typedef Base type;
};

class Derived: public Base {
public:
  typedef Derived type;
};

私は次のようなものが欲しいです:

int main() {
  Base * bs = new Derived();

  decltype(*bs)::type newvar;
}

静的/動的キャストを使用せずに、上記のような方法でDerivedクラスのタイプを取得するにはどうすればよいですか?

4

2 に答える 2

3

あなたのコードに*bsは、実際には2つのタイプがあります。静的タイプ、つまり宣言されたタイプ、つまりBase。もう1つのタイプは動的タイプです。これは、実際に指しているオブジェクトのタイプですDerived。静的型はコンパイル時に認識される唯一の型であり、変更することはできません。TMP、通常の関数呼び出し、およびすべてのテンプレート処理はコンパイル時に行われるため、静的型のみがそれらにも適用されます。

動的型を使用する唯一の方法は、コンパイラーにそれを明示的に伝えることです。つまり、仮想関数を呼び出すか、を使用しdynamic_castます。

表示しているコードの「ようなもの」が必要だと言いますが、それで何を達成したいですか?dynamic_cast通常は現実的な選択肢ではないので、答えは「動的タイプに応じて何かをしたい場合は仮想関数を使用する」だと確信しています。

于 2012-12-05T13:23:11.210 に答える
1

いいえ、それはできません。

C ++は静的に型付けされた言語です。つまり、コンパイル時に型を決定する必要があります。
この例では、bsポイントしているオブジェクトタイプがわかりません。
明確にするために、以下のシナリオを参照してください。

Base * bs = (bool)? new Base() : new Derived();

virtualあなたはメカニズムに頼らなければならないかdynamic_cast、あなたの究極の目的を達成するために。

于 2012-12-05T12:41:08.183 に答える