如果我理解正确,typeid可以确定多态中的实际类型,而typeof则不能。
它们的返回用于不同目的也是如此:typeof的返回用作可以定义变量的类型关键字,但是typeid的返回不能?
有没有办法同时获取多态的实际类型并使用return as type关键字来定义另一个变量?我希望从指向基类的指针获取派生类类型,并定义一个变量或指向派生类的指针。类似的东西:
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
非常感谢!
答案 0 :(得分:7)
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
}
}
答案 1 :(得分:3)
假设等级A&lt; -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特定于其各自的类,而不是虚拟的。显然,这可以在某种程度上进行优化。