允许,
COM就是使用类似的技术!

解决方案 »

  1.   

    糊说!,你有没有看过《深度探索C++对象模型》,这里里就提到VTPR可能在头部也可能在尾部,用在多重继承与继承的情况下,你该如何做呢?,你说的是C++内部的一些实现,但你在编程中一般是绝对不要这样做?,COM也是使用C++技术,所以我个人的答案是:
    C++绝对不允许你这样做,即使可以,也不要这样做!,你的问题难道非得用这种方法???
      

  2.   

    同意 vcmfc, COM 中的繼承是要求成員函數的位置固定的, 而 MFC 中則是通過一些 Macro 來在類中做了許多標誌, 建議看看 MFC 中 Message Map 相關的 Macro 的具體內容和寫法.
      

  3.   

    我只想知道编译器允许不允许这样通过指针做?
    我做一个很简单的类,
    class A
    {
      int a;
      void funca();
      vitual vfunca();
    }...
    A ss;
    ...现在我可以得到
    sizeof(A)=8
    &ss的地址为0x007689A0(假设)
    &ss.a地址为0x007689A4(这些在VC上可以验证)因此我们可以断定前4个字节为vptr指针,
    我就想:可否通过这个地址调用虚拟函数呢?
            我如何得知非虚函数的地址或偏移呢?
    我只是想验证一下虚拟函数的指针问题(通过虚拟表指针调用我的虚函数),并非遇到什么难题。
                                              
      
      

  4.   

    你要调用当然是可以的,不过当你吧A扩充了以后class A
    {
      int a;
      int b;
      void funca();
      vitual vfunca();
    };那么刚才的函数指针还有效吗?只能看具体的编译器了。
      

  5.   

    指针当然不是固定数值不过在程序里

    &ss
    &ss.a
    &ss.b代表地址即可,如果是ss一个int那么,一切都好办了:
    UINT * pp=&ss
    cout<<*pp<<endl;//就可以把ss的地址写到pp里,由pp操作这个地址。但是现在ss是一个类A的对象,
    UINT * pp=(UINT)&ss;//程序提示无法将一个类强制转化为UINT,也就没有下文了(通过pp得到虚函数表地址,以及地址表第一项的内容)
      

  6.   

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

  7.   

    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
    }}
      

  8.   

    Kevin_qing(Kevin) 兄:谢谢,我就是这个意思加分了
    有空再欢迎各位看看下一贴:
    http://www.csdn.net/expert/topic/112/112224.shtm