dynamic_cast—多态类型的转化
表达式:dynamic_cast(expression)把操作数expression转化为一个type-id对象。type-id必须是一个指针或者是一个引用。如果type-id是一个指针,那么expression必须是一个指针。如果type-id是一个引用,那么expression是一个左值表达式。
如果type-id是一个指针,这个指针指向的是expression的直接或者间接基类,那么指向唯一父类对象的type-id是最终结果。(例如)
class B { ... };
class C : public B { ... };
class D : public C { ... };
void f(D* pd)
{
C* pc = dynamic_cast(pd); // ok: C is a direct base class
// pc points to C subobject of pd
B* pb = dynamic_cast
(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
...
}
这种类型的转化称为”向上转换”(upcast),因为它将指针向类的层次关系的上层移动。Upcast是一种隐式的转化。
如果type-id是void *,运行时检查会确定expression的实际的类型。结果由expression指向的完整的指针对象。
class A { ... };
class B { ... };
void f()
{
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast(pa);
// pv now points to an object of type A
...
pv = dynamic_cast(pb);
// pv now points to an object of type B
}
如果type-id不是void *,那么运行时会检查由expression指向的对象是否能够转化为由type-id指向的对象。
如果expression的类型是type-id类型的基类,运行时检查会确保expression是否实际上指向一个type-id的完整的对象。如果为true,那么结果为type-id所指向的完整的对象。例如:
class B { ... };
class D : public B { ... };
void f()
{
B* pb = new D; // unclear but ok
B* pb2 = new B;
D* pd = dynamic_cast(pb); // ok: pb actually points to a D
...
D* pd2 = dynamic_cast(pb2); // pb2 points to a B not a D
// cast was bad so pd2 == NULL
...
}
这种类型的转化称为“downcast”—向下转型。因为它从类的层次结构中向下移动。从一个指定的父类到子类。
对于多继承关系,模糊的情况产生了。考察下面的类层次关系。
Class Hierarchy Showing Multiple Inheritance
类型D的对象能够安全的转化为B或者C。然而D如果转化为A,那么它将转化为哪个A?这将产生一个有歧义的转化错误。为了解决这个问题,你可以执行两个无歧义的转化。例如:
void f()
{
D* pd = new D;
A* pa = dynamic_cast(pd); // error: ambiguous
B* pb = dynamic_cast(pd); // first cast to B
A* pa2 = dynamic_cast
转载于:https://www.cnblogs.com/yawer/archive/2007/11/27/973909.html