C++向下转换有什么用?以及这个例子为什么有成功有失败?
本帖最后由 getinposition 于 2013-06-24 09:04:22 编辑 向上转我还能理解,向下转有什么用...感觉完全就是乱来嘛...
另外这个例子中为什么一个能成功,一个失败?原因是什么?
#include <iostream>
using namespace std;
class CObject
{
public:
virtual void Serialize()
{
cout<<"CObject::Serialize()\n\n"<<endl;
}
};
class CDocument : public CObject
{
public:
int m_datal;
virtual void Serialize()
{
cout<<"CDocument::Serialize()\n\n"<<endl;
}
};
class CMyDoc : public CDocument
{
public:
int m_data2;
CMyDoc(CDocument &Doc)
{
m_data2 = 0;
}
void func()
{
cout<<"CMyDoc::func()"<<endl;
Serialize();
}
virtual void Serialize()
{
cout<<"CMyDoc::Serialize()\n\n"<<endl;
}
};
int main()
{
CDocument *document = new CDocument;
CMyDoc *c = dynamic_cast<CMyDoc*>(document);
if(c == NULL)
cout<<"null"<<endl;
((CMyDoc)(*document)).func();//这是什么神奇用法,why??
return 0;
}
if( ( CDocument * doc = dynamic_cast<CDocument *>(obj) ) != 0 )
{
doc->do_something();
}
int main()
{
CDocument *document = new CDocument;
CMyDoc *c = dynamic_cast<CMyDoc*>(document);
//document不是一个CMyDoc,而是一个CDocument,这个转换必然失败。
if(c == NULL)
cout<<"null"<<endl;
((CMyDoc)(*document)).func();//这是什么神奇用法,why??
//(CMyDoc)(*document)是将一个document强制类型转换为一个CMyDoc,
//这个转换将通过调用CMyDoc的构造函数CMyDoc(CDocument &Doc)来完成
//.func();在上一步构造出来的临时对象上调用func();
return 0;
}