知道地址,VC允不允许得到其内容? 允许,COM就是使用类似的技术! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 糊说!,你有没有看过《深度探索C++对象模型》,这里里就提到VTPR可能在头部也可能在尾部,用在多重继承与继承的情况下,你该如何做呢?,你说的是C++内部的一些实现,但你在编程中一般是绝对不要这样做?,COM也是使用C++技术,所以我个人的答案是:C++绝对不允许你这样做,即使可以,也不要这样做!,你的问题难道非得用这种方法??? 同意 vcmfc, COM 中的繼承是要求成員函數的位置固定的, 而 MFC 中則是通過一些 Macro 來在類中做了許多標誌, 建議看看 MFC 中 Message Map 相關的 Macro 的具體內容和寫法. 我只想知道编译器允许不允许这样通过指针做?我做一个很简单的类,class A{ int a; void funca(); vitual vfunca();}...A ss;...现在我可以得到sizeof(A)=8&ss的地址为0x007689A0(假设)&ss.a地址为0x007689A4(这些在VC上可以验证)因此我们可以断定前4个字节为vptr指针,我就想:可否通过这个地址调用虚拟函数呢? 我如何得知非虚函数的地址或偏移呢?我只是想验证一下虚拟函数的指针问题(通过虚拟表指针调用我的虚函数),并非遇到什么难题。 你要调用当然是可以的,不过当你吧A扩充了以后class A{ int a; int b; void funca(); vitual vfunca();};那么刚才的函数指针还有效吗?只能看具体的编译器了。 指针当然不是固定数值不过在程序里用&ss&ss.a&ss.b代表地址即可,如果是ss一个int那么,一切都好办了:UINT * pp=&sscout<<*pp<<endl;//就可以把ss的地址写到pp里,由pp操作这个地址。但是现在ss是一个类A的对象,UINT * pp=(UINT)&ss;//程序提示无法将一个类强制转化为UINT,也就没有下文了(通过pp得到虚函数表地址,以及地址表第一项的内容) UINT * pp=(UINT)&ss; ????????????????????老兄应该是这样的UINT * pp=(UINT*)&ss; 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(Kevin) 兄:谢谢,我就是这个意思加分了有空再欢迎各位看看下一贴:http://www.csdn.net/expert/topic/112/112224.shtm 请问一下,为什么VC SDK无法显示图片? VC程序debug版改release版时的错误 vmr9相关的问题,实在是解决不了了 ,快受不了了。。。 如何实现vc中的word文档自动化实现 第一次封装ActiveX,help 【————】哪位高手有时间,能否公布qq,可以问些小问题 CAsyncSocket问题, DLL 中如何响应事件 求pcm数据流 请问sql server中如何对sum()出来的值进行排序 Edit control 的一个怪问题 《有关windows程序设计之二》 有关组合框的一个问题
C++绝对不允许你这样做,即使可以,也不要这样做!,你的问题难道非得用这种方法???
我做一个很简单的类,
class A
{
int a;
void funca();
vitual vfunca();
}...
A ss;
...现在我可以得到
sizeof(A)=8
&ss的地址为0x007689A0(假设)
&ss.a地址为0x007689A4(这些在VC上可以验证)因此我们可以断定前4个字节为vptr指针,
我就想:可否通过这个地址调用虚拟函数呢?
我如何得知非虚函数的地址或偏移呢?
我只是想验证一下虚拟函数的指针问题(通过虚拟表指针调用我的虚函数),并非遇到什么难题。
{
int a;
int b;
void funca();
vitual vfunca();
};那么刚才的函数指针还有效吗?只能看具体的编译器了。
用
&ss
&ss.a
&ss.b代表地址即可,如果是ss一个int那么,一切都好办了:
UINT * pp=&ss
cout<<*pp<<endl;//就可以把ss的地址写到pp里,由pp操作这个地址。但是现在ss是一个类A的对象,
UINT * pp=(UINT)&ss;//程序提示无法将一个类强制转化为UINT,也就没有下文了(通过pp得到虚函数表地址,以及地址表第一项的内容)
#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
}}
有空再欢迎各位看看下一贴:
http://www.csdn.net/expert/topic/112/112224.shtm