質問

私が正しく理解していれば、TypeIDは多型の実際のタイプを決定できますが、TypeOFはできません。

また、リターンがさまざまな目的で使用されていることも事実です。TypeOFのリターンは、変数を定義できるタイプキーワードとして使用されますが、TypeIDのリターンはできませんか?

多型の実際のタイプを取得し、リターンをタイプキーワードとして使用して別の変数を定義する方法はありますか?基本クラスを指すポインターから派生クラスのタイプを取得し、派生クラスの変数またはポインターを定義したいと考えています。何かのようなもの:

baseclass *p = new derivedclass  
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p); 
// would like to convert the pointer from pointing to a base class 
// to its derived class

どうもありがとうございました!

役に立ちましたか?

解決

C ++ 0x 持っています decltype このように使用できます:

int someInt;
decltype(someInt) otherIntegerVariable = 5;

しかし、普通の古いC ++の場合、残念ながら、いいえ。

私はそうだと思います decltype あなたは多型タイプが欲しいので、本当にあまり助けにはなりません、 いいえ 宣言されたタイプ。あなたがやりたいことをするための最も簡単な方法は、特定のタイプにダイナミックなキャストを試みて、 NULL.

struct A {
    virtual ~A() {}
};
struct B : public A {};
struct C : public A {};

int main() {
    A* x = new C;
    if(B* b_ptr = dynamic_cast<B*>(x)) {
        // it's a B
    } else if(C* c_ptr = dynamic_cast<C*>(x)) {
        // it's a C
    }
}

他のヒント

階層a <-b <-cを仮定すると

A * p = new AorBorC;   // create new object of some sort

if ( dynamic_cast <C*>(p) ) {
  C * c = dynamic_cast <C*>(p);
  c->CFunc();
}
else if ( dynamic_cast <B*>(p) ) {
  B * b = dynamic_cast <B*>(p);
  b->BFunc();
}
else if ( dynamic_cast <A*>(p) ) {
  A * a = dynamic_cast <A*>(p);
  a->AFunc();
}

AFUNC、BFUNC、CFUNCはそれぞれのクラスに固有であり、仮想ではありません。明らかに、これは多少最適化できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top