C++向下转换有什么用?以及这个例子为什么有成功有失败?

getinposition 2013-06-24 09:00:30
向上转我还能理解,向下转有什么用...感觉完全就是乱来嘛...

另外这个例子中为什么一个能成功,一个失败?原因是什么?


#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;
}

...全文
93 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡木疙瘩 2013-06-24
  • 打赏
  • 举报
回复
一般来说向上映射是常见的,这符合面向对象的IS-A原则。 但有时向下映射也是需要的。比如一个vector<CObject*>中,存储的都是CObject*指针,但由于我们可以向上映射,它也可以用来存储CDocument指针。我们从从vector<CObject*> v中取出一个CDocuemtn对象,但得到的类型是CObject*,我们无法通过这个指针访问CDocument扩充的成员,这时就需要向下映射,把它转换为CDocument* 如果我们可以确定这个CObject*一定指向一个CDocument对象(比如v的使用者只向里面添加CDocument*,不添加其它类型的对象),那么我们可以用static_cast<CDocument*>(v[0])来转换 但有时我们不能保证这个vector里面只有CDocument*一种类型,这时我们就要用dynamic_cast<CDocument*>(v[0]);如果v[0]中原本存放的就不是CDocument*,这个转换就会失败,我们就可以对转换结果进行判断,以此来决定我们是否要访问CDocument特有成员。 dynamic_cast的最常用形式为:

    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;
}

64,671

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧