求助??为什么输出不一样?

hooligan31000 2004-03-26 09:45:03
#include<iostream.h>

class cobject
{
public :
virtual void serialize()
{
cout<<"cobject::serial"<<endl;
}
};

class cdocument:public cobject
{
public:
int m_data1;
void func()
{
cout<<"cdocument::func()"<<endl;
serialize();

}
virtual void serialize()
{
cout<<"cdocument::serialize()"<<endl;
}
};

class cmydoc:public cdocument
{
public :
int m_data2;
virtual void serialize()
{
cout<<"cmydoc::serical()"<<endl;
}

};

void main()
{
cmydoc mydoc;
cmydoc * pmydoc=new cmydoc;

mydoc.func(); // 1)

((cdocument*)(&mydoc))->func(); // 2)

pmydoc->func(); //3)

((cdocument)mydoc).func(); //4)

}

为什么第4个函数输出和前面三个不一样,为什么??
谢谢

...全文
46 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
angelo23 2004-03-26
  • 打赏
  • 举报
回复
2 相当于
cdocument *p2 = dynamic_cast<cdocument*>(&mydoc);
p2->func();

4 相当于
cdocument slicedMydoc = static_cast<cdocument>(mydoc);
slicedMydoc.func();

前者是通过指针,运用虚函数机制,调用mydoc的serialize
而后者是通过一个对象来静态调用它的函数,C++里多态是要靠指针或引用来实现的
hooligan31000 2004-03-26
  • 打赏
  • 举报
回复
二、四的区别在哪??
hooligan31000 2004-03-26
  • 打赏
  • 举报
回复
能否说的详细点,谢谢
angelo23 2004-03-26
  • 打赏
  • 举报
回复
因为((cdocument)mydoc).func();应该是创建了一个cdocument类型的临时对象(实际就是mydoc被sliced之后的cdocument的subobject部分),然后通过这个临时对象调用func,这里不是用引用或者指针,而这个临时对象的“动态类型”就是cdocument,所以最后调用的是cdocument的serialize
gaowenjun233 2004-03-26
  • 打赏
  • 举报
回复
((cdocument)mydoc)func(); //4)

多态性只有在引用和指针是才能呈现出来
在对象操作符.是调用当前对象类型的那个函数,而不是赋值的那个对象函数
改为((cdocument)pmydoc)->func();
computerhero 2004-03-26
  • 打赏
  • 举报
回复
应该不一样。因为((cdocument)mydoc).func();把mydoc截取了。它输出父类的信息。

64,676

社区成员

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

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