题
如果正确地明白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
}
}
其他提示
假设一个层次中的< - 乙< - Visual 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