C++多态调用和继承内存分布

以下面代码为例:

class A
{
public:
    int a;
    A()
    {
        a = 1;
    }
    virtual void fA()
    {
        printf("A\n");
    }
    void fAA()
    {
        printf("AA\n");
    }
};

class B
{
public:
    int b;
    B()
    {
        b = 2;
    }

    virtual void fB(){}
};

class C : public A
{
public:
    int c;
    C()
    {
        c = 3;
    }

    void fA()
    {
        printf("C\n");
    }
    void fAA()
    {
        printf("AAa\n");
    }
};


void main()
{
    C c;
    A* a = &c;

    printf("%d\n", sizeof(c));
    printf("%d\n", sizeof(*a));
    a->fA();
    a->fAA();
    getchar();
}

首先C c; 创建一个C类型的对象c,类C是继承A的。在vs2012中调试,在监视中查看c的内容,如下图所示:



可以看到c对象继承了A对象的_vfptr、变量a,然后还有自身的变量c。_vfptr是指向vtable虚函数表的指针,可以看到该表中存放了一个函数指针C::fA(),因为在A中声明了虚函数fA(),并且在C中进行了重写,所以虚函数表对应位置填写的是C实现的fA()的函数地址。所以c的大小是12B。

A* a = &c; *a的大小为8B。

接着调用a->fA(); 看下在vs2012中反汇编的结果:

    a->fA();
011D361E  mov         eax,dword ptr [a]        // 获取a指向对象的地址
011D3621  mov         edx,dword ptr [eax]      // 获取_vfptr指向的地址
011D3623  mov         esi,esp  
011D3625  mov         ecx,dword ptr [a]     
011D3628  mov         eax,dword ptr [edx]      // 获取vtable中第一个虚函数指向的地址
011D362A  call        eax                      // 调用C::fA()
011D362C  cmp         esi,esp  
011D362E  call        __RTC_CheckEsp (011D12F3h)  

再调用a->fAA(); 该函数并不是虚函数,地址不存放在虚函数表中,可以直接根据类名查找到函数地址进行调用,反汇编结果如下:

    a->fAA();
011D3633  mov         ecx,dword ptr [a]  
011D3636  call        A::fAA (011D1456h)  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
俄罗斯方块是一款经典的游戏,多年来一直受到广大玩家的喜爱。MFC(Microsoft Foundation Class)是一套用于Windows编程的C++类库,可以帮助开发者快速创建Windows界面应用程序。 在俄罗斯方块游戏中,我们可以使用多态调用MFC来实现游戏的各种功能。 首先,我们可以创建一个基类TetrisBlock,其中包含俄罗斯方块的基本属性和方法,比如获取方块形状、旋转方块等。 然后,我们可以创建多个继承自TetrisBlock的子类,每个子类代表不同类型的俄罗斯方块,比如I型、T型、L型等。这些子类可以重写基类的方法,以实现自身特定的功能。 接下来,我们可以使用MFC提供的类和方法来创建游戏界面,比如使用CWnd类创建一个窗口,使用CDC类在窗口中绘制游戏界面等。 在游戏进行过程中,我们可以使用多态调用来实现不同类型的俄罗斯方块的移动和旋转。比如,通过创建一个指向基类TetrisBlock的指针,将其指向任意一个子类对象,然后调用指针所指向对象的方法来进行操作。 此外,我们还可以使用MFC提供的类和方法实现用户交互,比如通过CButton类创建按钮,通过CDialog类创建对话框等。这样,玩家就可以使用鼠标或键盘来控制俄罗斯方块的移动、旋转和其他操作。 总之,通过多态调用MFC,我们可以方便地实现俄罗斯方块游戏的各种功能和界面。这样,开发者可以更加专注于游戏的逻辑和用户体验,而无需过多关注底层的实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值