suffer 发表于 2005-7-22 20:36

C++父类和子类对象指针之间的转换

C++父类和子类对象指针之间的转换,有示例代码<BR>C++父类和子类对象指针之间的转换
<br>由子类向父类转换很简单, 用默认转换.<BR>例如 CWnd* pWnd = (CWnd*)(&amp;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 &lt;iostream&gt;<BR>using namespace std;
<p>class CPoint<BR>{<BR>public:<BR>virtual void f(){cout &lt;&lt; "CPoint::f" &lt;&lt;endl;}<BR>};
<p>class CPoint3D : public CPoint<BR>{<BR>public:<BR>virtual void f(){cout &lt;&lt; "CPoint3D::f" &lt;&lt;endl;}<BR>};
<p>int main() <BR>{<BR>CPoint point,*pPoint; <BR>CPoint3D point3D,*pPoint3D;
<p>//子类向父类类型转换,直接强制转换就可以了,但实际仍然指向子类对象<BR>pPoint = (CPoint*)&amp;point3D;<BR>pPoint-&gt;f(); //调用的仍然是子类的函数,这便是虚函数的魅力所在
<p>//父类向子类类型转换,要用dynamic_cast<BR>pPoint3D = dynamic_cast(pPoint);<BR>pPoint-&gt;f(); //pPoint实际指向一个CPoint3D对象,故可以正确转换
<p>pPoint3D = dynamic_cast(&amp;point);<BR>cout &lt;&lt; (int*)pPoint3D &lt;&lt; endl; //&amp;point指向的不是一个CPoint3D对象,返回值为NULL<BR>return 0;<BR>}<BR>运行结果为:<BR>CPoint3D::f<BR>CPoint3D::f<BR>00000000
页: [1]
查看完整版本: C++父类和子类对象指针之间的转换