免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2211 | 回复: 4
打印 上一主题 下一主题

一个通过虚表指针访问虚函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-28 09:33 |只看该作者 |倒序浏览
#include <iostream>
using namespace std;
class base{
  public:
  int a;
  virtual void foo() {cout<<"base "<<a<<endl;}
};

class derived:public base{
  public:
  virtual  void foo() {cout<<"derived "<<a<<endl;}
};


typedef void(*fun)();


int main(){
  derived B;
  base A,*pa;
  B.a=2;
  A.a=1;
  
  printf("%x\n",*((int *)&A));
  printf("%x\n",*((int *)&B));



  pa=&B;
  memcpy(&A,&B,sizeof(A));

  A.foo();
   
  fun pf=NULL;
  int *vptr;
  memcpy(&vptr,&A,4);
  pf= (fun) *vptr;
  pf();  

  
  system("pause");
  return 0;
}

dev-c++ 编译结果:

441c68
441c78
base 2
derived 4262624

我想把子类对象复制给父类对象 然后通过虚表指针的方式调用函数
对结果很疑惑
A.foo 不也是通过虚表指针访问到函数的吗
pf() 与 A.foo() 按理结果应该是一样的
为什么会产生不同的结果呢
希望高手指点一下

论坛徽章:
0
2 [报告]
发表于 2009-05-28 12:41 |只看该作者
原帖由 pumasuede 于 2009-5-27 17:33 发表
#include
using namespace std;
class base{
  public:
  int a;
  virtual void foo() {cout


A.foo()不走虚函数表,需要指针或引用才行。

论坛徽章:
0
3 [报告]
发表于 2009-05-28 13:30 |只看该作者

回复 #2 emacsnw 的帖子

这个是C++标准规定的吗?
以前还从来没有注意到过这问题。

-------------------------------------------
btw: Santa Monica 什么意思?呵呵,昨天看《老友记》里面提到了 Santa,圣诞老人。 Monica是女主角之一。 这个跟《老友记》有关系吗?

论坛徽章:
0
4 [报告]
发表于 2009-05-28 13:39 |只看该作者
原帖由 emacsnw 于 2009-5-28 12:41 发表


A.foo()不走虚函数表,需要指针或引用才行。


谢谢
还有一个问题是 derived后面的值为什么不是2而是随机值呢

论坛徽章:
0
5 [报告]
发表于 2009-05-28 14:17 |只看该作者
原帖由 GodPig 于 2009-5-27 21:30 发表
这个是C++标准规定的吗?
以前还从来没有注意到过这问题。

-------------------------------------------
btw: Santa Monica 什么意思?呵呵,昨天看《老友记》里面提到了 Santa,圣诞老人。 Monica是女主 ...


C++标准里面没规定虚函数要如何实现,也没有虚函数表的概念。

-------------------------------------------
是个地名。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP