⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hellotest.cpp

📁 vtble 虚函数表
💻 CPP
字号:
#include <stdio.h>
#include <malloc.h>
#include "HelloInterface.h"
#include "WelcomeInterface.h"

#define name_offset = 3
#define age_offset = 2

int age(void *_this) {
    unsigned int *objptr = (unsigned int *)_this;

    return *++objptr;
}

void setCAge(int age, void *_this) {
    unsigned int *objptr = (unsigned int *)_this;
    objptr++;
    *objptr = age;
}

char* name() {
    return "Zhang Jiuan";
}

void show(char *additionInfo) {
    printf("Hello, %s\n", additionInfo);
}

class Hello: public IHello, public IWelcome {
    int _age;
    char *_name;
public:
    Hello(int age, char *name) {
        _age = age;
        _name = name;
    }

    int getAge() {
        return _age;
    }

    char *getName() {
        return _name;
    }

    void setAge(int a) {
    }

    void showInfo() {
    }

    void welcome() {
        printf("Welcome to you\n");
        printf("name:%s\n", _name);
        printf("age :%d\n", _age);
    }
};



int main() {
    void *obj = (void *) malloc (2 * sizeof (unsigned int));
    unsigned int *vtb = (unsigned int *) malloc (4 * sizeof (unsigned int));
    unsigned int *vptr = vtb, procAddr;
//    IHello *pHello;
//    int myage;
//    char *myname;

    Hello h(20, "jiu an");
    Hello *ph = &h;

    h.welcome();
    vptr = (unsigned int *)&h;
    vptr++;
    vptr = (unsigned int*)(*vptr);
    procAddr = *vptr;

    printf("h=0x%08x, vptr=0x%08x\n", h, vptr);
    //__asm int 3;
    vptr = (unsigned int *)&h;
    vptr++;

    __asm mov ecx, vptr;
    __asm call procAddr;

    printf("sizeof(Hello):%d\n", sizeof(Hello));
    printf("sizeof(Hello):%d\n", sizeof(ph));

#if 0
    //printf("name %s\n", h.getName());

    //set virtual table
    *vptr++ = (unsigned int)(void *)age;
    *vptr++ = (unsigned int)(void *)name;
    *vptr++ = (unsigned int)(void *)show;
    *vptr = (unsigned int)(void *)setCAge;

    *(void **)obj = (void *)vtb;

    //set field
    vptr = (unsigned int*)obj;
    vptr++;

    *vptr = 25;

    pHello = (IHello*)obj;


    myname = pHello->getName();

    __asm push obj;
    //__asm push myname;
    pHello->setAge(20);

    __asm push obj;
 myage = pHello->getAge();
    //pHello->showInfo(pHello->getName);

    printf("name is %s, age is %d\n", myname, myage);
#endif
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -