求教类型强制转换的规律 (困惑于MFC中的METHOD_PROLOGUE宏)

gzezhang 2001-02-22 03:33:00
小弟最近在学习COM. 在模拟其原理的过程中碰到下面的问题, 源代码见下.

wrap指针是 : 0xe380f54
wrap.m_first地址是 : 0xe380f58
offsetof(wrap, m_first)的值是 : 4
show1中运行 this 得值是 : 0xe380f58, 也就是与wrap.m_first的
值是一样的.

我原本设想, 在show1中运行 this - offsetof(wrap, m_first) 后就应该是
0xe380f54, 也就是可以得出 wrap 指针的值. 可事实上, 得出来的是 0xe380f4c.

非要按(wrap*)((char*)this-offsetof(wrap, m_first)) 才能够得到正确的结果
0xe380f54. 即使用 (wrap*)(this - offsetof(wrap,m_first)) 得出的也是错误 !

这一段运算的原型来自于MFC中的 METHOD_PROLOGUE 宏.

十分困惑使用类型强制的时机. 在MFC中使用类型强制很普遍, 有什么规律可以遵守?
十分感谢 !!!

# include "iostream.h"
# include "stddef.h"

struct first {
virtual void set1()=0;
virtual void show1()=0;
};

class wrap {
private :
int a, b;
public :
wrap() { cout << "\n constructor"; };
~wrap() { cout << "\n destructor"; };
class xfirst : public first {
public :
void set1() { };
void show1();
} m_first;
};

void wrap::xfirst::show1() { cout << "\n" << this << " " << (wrap*)((char*)this-offsetof(wrap,m_first)); };

void main()
{
wrap* x=new(wrap);
cout << "\n" << x;
x->m_first.show1();
delete x;
}


...全文
165 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lms 2001-02-22
  • 打赏
  • 举报
回复
(char*)(this - n) = (char*)this - sizeof(*this) * n

16,551

社区成员

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

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

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