質問
私が正しく理解していれば、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はそれぞれのクラスに固有であり、仮想ではありません。明らかに、これは多少最適化できます。
所属していません StackOverflow