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

...全文
103 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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;
}
内容概要:本文介绍了软件定义汽车(SDV)的最佳实践案例,重点围绕基于Vector技术的电子电气(E/E)架构设计与实现。文档展示了高算力计算平台(HPC)、区域控制器(Zone ECU)和车载网络(如CAN、Ethernet)的系统架构布局,并结合AUTOSAR操作系统(Classic/Adaptive)、虚拟化(Hypervisor)和SOA服务设计,构建现代化车载系统。通过vCANdrive平台演示了从开发、测试(SIL/HIL)、到OTA升级的全流程,涵盖传感器、执行器、应用层软件及云端协同的集成方案。同时展示了硬件原型(如树莓派、Triboard)和MICROSAR系列工具链在实际项目中的应用。; 适合人群:从事汽车电子系统开发、车载软件架构设计以及智能网联汽车研发的工程师和技术管理人员,具备一定的嵌入式系统或AUTOSAR基础者更佳。; 使用场景及目标:①理解软件定义汽车的整体架构设计方法;②掌握基于Vector工具链的HPC与区域控制器集成方案;③实现OTA更新、SIL/HIL测试、ETH-CAN通信转换等关键技术验证;④支持智能驾驶(ADAS)与智能座舱(IVI)系统的快速原型开发。; 阅读建议:建议结合Vector相关工具(如PREEvision、CANoe4SW、MICROSAR)进行实践操作,重点关注系统分层设计、通信机制与软件更新流程,同时可参考文档中的硬件连接示意图与信号映射关系进行仿真与实车验证。

65,199

社区成员

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

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