我基本上明白了,谢谢楼上的几位.
问下:goodluckyxl(被人遗忘的狗)
你是zju的那个wishingbone么?
我看msdn做了下笔记.
======================================
这个例子说明,子类向基类转换.
class B { ... };
class C : public B { ... };
class D : public C { ... };
void f(D* pd)
{
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd
B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
...
}
这个例子说明的是void*类型的向某一种类型的转换
其实这里不用dynamic_cast<type_id>也可以,他会隐士转换
class A { ... };
class B { ... };
void f()
{
A* pa = new A;
B* pb = new B;
void* pv = dynamic_cast<void*>(pa);
// pv now points to an object of type A
...
pv = dynamic_cast<void*>(pb);
// pv now points to an object of type B
}
这个例子说明自身类型转换主要是看它当前所直的对象和它将要转换的类型是否一致.而且这个一直是在程序运行中检测的.
class B { ... };
class D : public B { ... };
void f()
{
B* pb = new D; // unclear but ok
B* pb2 = new B;
D* pd = dynamic_cast<D*>(pb); // ok: pb actually points to a D
...
D* pd2 = dynamic_cast<D*>(pb2); //error: pb2 points to a B, not a D
// pd2 == NULL
...
}
下面是多重继承的,
这里我觉得有点奇怪,因为msdn上说从type D to type A,存在二义性.
但我觉得类型A就是一种啊,怎么会有二义性呢?
Class A
Class B : public A{….}
Class C: public A{….}
Class D: B,C;
void f()
{
D* pd = new D;
A* pa = dynamic_cast<A*>(pd); // error: ambiguous
B* pb = dynamic_cast<B*>(pd); // first cast to B
A* pa2 = dynamic_cast<A*>(pb); // ok: unambiguous
}
下面这个我就更有问题了.
Class A{….}
Class B: public A{……}
Class C:public A{……..}
Class D{……………}
Class E:public B,C,D{…….}
//这里是从父类到基类
void f(D* pd)
{
E* pe = dynamic_cast<E*>(pd);
B* pb = pe; // upcast, implicit conversion
A* pa = pb; // upcast, implicit conversion
}//这里从子类到父类,没用到dynamic_cast,也就是说,从子类到父类是可以不用这个的,我以前学C++的时候,觉得是可以不用dynamic_cast的,但必须要隐士转换.