马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
C++父类和子类对象指针之间的转换,有示例代码<BR>C++父类和子类对象指针之间的转换
<br>由子类向父类转换很简单, 用默认转换.<BR>例如 CWnd* pWnd = (CWnd*)(&ChildView);
<p>由父类向子类, 用dynamic_cast. 使用dynamic_cast是有限制的.<BR>例如对如下语句:<BR>CPoint3D* p1 = dynamic_cast(p);<BR>1.p虽然是CPoint类型, 但是p应当实际指向一个CPoint3D对象. 如果p实际指向的不是一个CPoint3D对象,则转换后的返回值为NULL.<BR>2.VC中必须在project setting中设定/GR选项, 即Enable Runtime Type Identification(RTTI).
<p>下面是一段示例代码:<BR>#include <iostream><BR>using namespace std;
<p>class CPoint<BR>{<BR>public:<BR>virtual void f(){cout << "CPoint::f" <<endl;}<BR>};
<p>class CPoint3D : public CPoint<BR>{<BR>public:<BR>virtual void f(){cout << "CPoint3D::f" <<endl;}<BR>};
<p>int main() <BR>{<BR>CPoint point,*pPoint; <BR>CPoint3D point3D,*pPoint3D;
<p>//子类向父类类型转换,直接强制转换就可以了,但实际仍然指向子类对象<BR>pPoint = (CPoint*)&point3D;<BR>pPoint->f(); //调用的仍然是子类的函数,这便是虚函数的魅力所在
<p>//父类向子类类型转换,要用dynamic_cast<BR>pPoint3D = dynamic_cast(pPoint);<BR>pPoint->f(); //pPoint实际指向一个CPoint3D对象,故可以正确转换
<p>pPoint3D = dynamic_cast(&point);<BR>cout << (int*)pPoint3D << endl; //&point指向的不是一个CPoint3D对象,返回值为NULL<BR>return 0;<BR>}<BR>运行结果为:<BR>CPoint3D::f<BR>CPoint3D::f<BR>00000000 |