关于虚函数的问题

zhang151 2003-10-18 04:14:26
请看下面的代码:
class CObject
{
public :
int m_data1;
virtual void Serialize(){cout<< "CObject::Serialize()\n\n")};
}
class CDocument : public CObject
{
public :
int m_data2;
void func(){cout<<"CDoument::func()"<<endl;
Serialize();}
virtual void Serialize(){cout<<"CDocument::Serialize()\n\n");
}
class CMyDoc : public CDocument
{
public :
int m_data3;
virtual void Serialize(){cout<<"CMyDoc::Serialize()\n\n");}
}

void main()
{
CMyDoc mydoc;
CMyDox *pmydoc = new CMyDoc;
cout<<"#1 testing"<<endl;
mydoc.func();
((CDocument *)(&mydoc))->func();
}
为什么在((CDocument *)(&mydoc))->func()里输出的是
CMyDoc::Serialize(),而不是CDocument::Serialize?
不是已经做了强制转化了吗?这是时候虚函数表里的指针应该指向
CDocument 类里面的Serialize()了吗?请大虾指教
...全文
25 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
askhe 2003-10-25
  • 打赏
  • 举报
回复
我对这句的理解:
((CDocument *)(&mydoc))->func()是不是就相当于
CDocument* p=&mydoc;
一个父类指针指向其子类的对象,由于虚函数的原因所以得到结果
CMyDoc::Serialize(),
不知道理解的对不对
jessenee 2003-10-22
  • 打赏
  • 举报
回复
C++编程思想,很好的一本书
program2100 2003-10-21
  • 打赏
  • 举报
回复
学习......
xiaoyunet 2003-10-20
  • 打赏
  • 举报
回复
去掉virtual关键字吧,这样你就可以得到你想要的结果了。
robbie24 2003-10-19
  • 打赏
  • 举报
回复
恩...如我所愿(笑)
这种在一般member function中调用virtual member function的例子是最搞的.往往对于阅读的人来说.就向这位楼主现在正在阅读的MFC,大量这样的例子,对于阅读能力是个挑战.(笑)
Diablohe 2003-10-19
  • 打赏
  • 举报
回复
robbie24(独行虾)
是否在内部调用成员函数的时候,前面都会加this指针呢?
确实是的,根据C++名字查找规则,如果你的类中已经包含一个名字为func的方法,那么在另一个方法中调用func时首先找到的就是类本身的func方法,调用方式就是this->func(),即使存在一个全局函数名字为func,也不会找到这个全局的函数,只有在类本身没有func方法是,调用方式才是::func();
leebuilder 2003-10-19
  • 打赏
  • 举报
回复
CMyDoc重的Serialize成员函数屏蔽的父类的Serizlize成员函数,并继承了func函数,相当于CMyDoc自己的函数所以调用CMyDoc::Serialize();
robbie24 2003-10-18
  • 打赏
  • 举报
回复
是否在内部调用成员函数的时候,前面都会加this指针呢?(与data member相似)
因为
void CDocumnet::func()
{cout<<"CDoument::func()"<<endl;
this->Serialize();}
因为Serialize为virtual,所以无论怎么强制转换,转的总归是指针变量的类型,而实际所指对象仍旧不变,虚函数只看对象,不看指针.
所以就是如上结果.
我的问题有否解答?
zhang151 2003-10-18
  • 打赏
  • 举报
回复
请问Mattary(Mattary):
动态绑定真的只支持指针类型吗?
Wolf0403 2003-10-18
  • 打赏
  • 举报
回复
static/dynamic_cast<CDocument *>(&mydoc)->func(); 都是 CMyDoc
而且,就算是指针,因为 Serialize 是虚函数,所以始终都应该执行 CMyDoc 的 Serialize 的
Mattary 2003-10-18
  • 打赏
  • 举报
回复
mydoc 对象不是指针类型, C++迟绑定只作用于指针类型,即使你在后面用的是强制转化, mydoc 所有的指向的成员函数都是在编译态已经确定,进行调用时, 根本就不会在用虚拟指针,
pmydoc 也不能通过这种强转达到这种效果,
不过你可能试试用static_cast or dynamic_cast
sakurar 2003-10-18
  • 打赏
  • 举报
回复
应该先看看C++基础
daizh 2003-10-18
  • 打赏
  • 举报
回复
参看侯捷的《深入浅出MFC》中的相关章节
晨星 2003-10-18
  • 打赏
  • 举报
回复
强制转化并不能改变指针所指向的对象的实际类型。
相反,父类指针可以指向子类对象,而且可以正确无误地调用子类自己的虚函数,这恰恰是面向对象机制所要求的

64,281

社区成员

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

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