知道地址,VC允不允许得到其内容?

wangjue28 2001-06-25 02:58:53
exam:
Class A;

A a;

我想问:
虚拟函数表指针是对象的第一个字(4字节),他指向一个函数的指针表,每一项是一个虚拟函数地址,我可以得到&a,能否得到a指向的四字节内容,由此得到函数指针表,然后我通过这个指针表的项目来调用函数.
C++允不允许这样的操作?如果允许如何做?
先付30分投石问路,如果能够解答,本人回报100分
...全文
156 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjue28 2001-06-26
  • 打赏
  • 举报
回复
Kevin_qing(Kevin) 兄:谢谢,我就是这个意思加分了
有空再欢迎各位看看下一贴:
http://www.csdn.net/expert/topic/112/112224.shtm
Kevin_qing 2001-06-26
  • 打赏
  • 举报
回复
UINT * pp=(UINT)&ss; ????????????????????

老兄

应该是这样的UINT * pp=(UINT*)&ss;

写了一个通过vtable call 虚函数的例子,你参考一下吧
#include "windows.h"
#include "stdio.h"
struct a{
int i;
virtual void vf(){
printf("%d\n",i);
}
};
typedef void (*pvf)(void);
void main()
{
a ss;

ss.i=2;
ss.vf();

LPDWORD pThis=(LPDWORD)((DWORD)(&ss));

LPDWORD pvt=(LPDWORD)(*pThis);

pvf f=(pvf)*pvt;

__asm{
mov ecx,pThis
call f
}



}
Kevin_qing 2001-06-26
  • 打赏
  • 举报
回复
UINT * pp=(UINT)&ss; ????????????????????

老兄

应该是这样的UINT * pp=(UINT*)&ss;
wangjue28 2001-06-26
  • 打赏
  • 举报
回复
指针当然不是固定数值不过在程序里

&ss
&ss.a
&ss.b代表地址即可,

如果是ss一个int那么,一切都好办了:
UINT * pp=&ss
cout<<*pp<<endl;//就可以把ss的地址写到pp里,由pp操作这个地址。

但是现在ss是一个类A的对象,
UINT * pp=(UINT)&ss;//程序提示无法将一个类强制转化为UINT,也就没有下文了(通过pp得到虚函数表地址,以及地址表第一项的内容)
Kevin_qing 2001-06-26
  • 打赏
  • 举报
回复
你要调用当然是可以的,不过当你吧A扩充了以后

class A
{
int a;
int b;
void funca();
vitual vfunca();
};

那么刚才的函数指针还有效吗?只能看具体的编译器了。

wangjue28 2001-06-26
  • 打赏
  • 举报
回复
大和尚:别调我胃口了,快说
Kevin_qing 2001-06-26
  • 打赏
  • 举报
回复
如果你一定要访问虚函数指针的话,建议你使用成员函数指针来自己实现虚函数。

这样直接就可以修改/访问函数指针了。

wangjue28 2001-06-26
  • 打赏
  • 举报
回复
我只想知道编译器允许不允许这样通过指针做?
我做一个很简单的类,
class A
{
int a;
void funca();
vitual vfunca();
}

...
A ss;
...

现在我可以得到
sizeof(A)=8
&ss的地址为0x007689A0(假设)
&ss.a地址为0x007689A4(这些在VC上可以验证)

因此我们可以断定前4个字节为vptr指针,
我就想:可否通过这个地址调用虚拟函数呢?
我如何得知非虚函数的地址或偏移呢?
我只是想验证一下虚拟函数的指针问题(通过虚拟表指针调用我的虚函数),并非遇到什么难题。

Sunny_lin 2001-06-26
  • 打赏
  • 举报
回复
当然可以,你试一试看!!!!
SuperChen 2001-06-26
  • 打赏
  • 举报
回复
同意 vcmfc, COM 中的繼承是要求成員函數的位置固定的, 而 MFC 中則是通過一些 Macro 來在類中做了許多標誌, 建議看看 MFC 中 Message Map 相關的 Macro 的具體內容和寫法.
vcmfc 2001-06-26
  • 打赏
  • 举报
回复
糊说!,你有没有看过《深度探索C++对象模型》,这里里就提到VTPR可能在头部也可能在尾部,用在多重继承与继承的情况下,你该如何做呢?,你说的是C++内部的一些实现,但你在编程中一般是绝对不要这样做?,COM也是使用C++技术,所以我个人的答案是:


C++绝对不允许你这样做,即使可以,也不要这样做!,你的问题难道非得用这种方法???
wangjue28 2001-06-25
  • 打赏
  • 举报
回复
能否举个简单例子验证一下?
Sunny_lin 2001-06-25
  • 打赏
  • 举报
回复
允许,
COM就是使用类似的技术!

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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