侯捷的一个动态绑定的例子搞不明白

wibrst 2009-03-04 06:19:54
侯捷的一个动态绑定的例子搞不明白


#include <iostream>
using namespace std;

class CObject{
public:
virtual void Serialize() { cout << "CObject::Serialize() \n\n"; }
};

class CDocument : public CObject{
public:
int m_data1;
void func() {// cout << "CDocument::func()" << endl;
Serialize();
}
virtual void Serialize() { cout << "CDocument::Serialize() \n\n"; }
};

class CMyDoc : public CDocument{
public:
int m_data2;
virtual void Serialize() { cout << "CMyDoc::Serialize() \n\n"; }
};
//------------------------------------------------------------------
void main(){
CMyDoc mydoc;
CMyDoc* pmydoc = new CMyDoc;

cout << "#1 testing ---" << endl;
mydoc.func();

cout << "#2 testing ---" << endl;
((CDocument*)(&mydoc))->func(); // 输出: CMyDoc::Serialize()
/* 问题!!: 上面这行:这里已经强制转换为CDocument*,
为什么不调用CDocument::Serialize(),
却调用CMyDoc::Serialize() ?
或者问: 强制类型转换为什么不起作用啊 ?
*/

cout << "#3 testing ---" << endl;
pmydoc->func();

cout << "#4 testing ---" << endl;
((CDocument)mydoc).func();
}
...全文
182 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lclhurricane 2009-03-05
  • 打赏
  • 举报
回复
类型转换并没有改变原始类型,只是生成了一个Cdocument类型的临时指针,它指向的是一个Cmydoc对象,所以调用serialize()。因为serialize()是虚函数,执行时动态绑定,调用的是派生类的serialize()。如果fun()是虚函数,那么也将调用派生类的fun()。
joneykk 2009-03-05
  • 打赏
  • 举报
回复
虽然上面已经把问题解释的很清了。
下面说下我从别一个角度看的。本质一样,但没有上面说的深
由于虚函数的作用,可以用基类指针调用派生类的虚函数。
现在强制转换了成了基类指针。它还是会那么干,调用派生类的。
cout << "#2 testing ---" << endl;
((CDocument)(*((CDocument*)(&mydoc)))).func();
改成这样,出来的就是CDocument::Serialize
rgmlkthh 2009-03-05
  • 打赏
  • 举报
回复
说得对。
[Quote=引用 7 楼 lclhurricane 的回复:]
类型转换并没有改变原始类型,只是生成了一个Cdocument类型的临时指针,它指向的是一个Cmydoc对象,所以调用serialize()。因为serialize()是虚函数,执行时动态绑定,调用的是派生类的serialize()。如果fun()是虚函数,那么也将调用派生类的fun()。
[/Quote]
wibrst 2009-03-04
  • 打赏
  • 举报
回复
不过还是不明白为什么this没有被类型转换呢?
lingyin55 2009-03-04
  • 打赏
  • 举报
回复
up
[Quote=引用 2 楼 baihacker 的回复:]
不要忘了,里面有个this
Serialize();
实际上是
this->Serialize();

this是动态类型的(指针,指向的类型和this中所反应的类型可能不一致)
Serialize是虚函数

于是执行动态绑定,也就是说调用和实际对象相关.
[/Quote]
wibrst 2009-03-04
  • 打赏
  • 举报
回复
嗯,一语中的~~
xuruichen 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baihacker 的回复:]
不要忘了,里面有个this
Serialize();
实际上是
this->Serialize();

this是动态类型的(指针,指向的类型和this中所反应的类型可能不一致)
Serialize是虚函数

于是执行动态绑定,也就是说调用和实际对象相关.
[/Quote]
正解
baihacker 2009-03-04
  • 打赏
  • 举报
回复
不要忘了,里面有个this
Serialize();
实际上是
this->Serialize();

this是动态类型的(指针,指向的类型和this中所反应的类型可能不一致)
Serialize是虚函数

于是执行动态绑定,也就是说调用和实际对象相关.

  • 打赏
  • 举报
回复
因为对象是CMyDoc类型,而Serialize是虚函数.所以结果是调用CMyDoc::Serialize

65,211

社区成员

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

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