飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2461|回复: 9

[C/C++] 哇哈哈构造(包含关系、继承关系、用数组模拟对象)

[复制链接]

该用户从未签到

发表于 2010-1-26 12:32:16 | 显示全部楼层 |阅读模式
// 继承时只继承父类私有成员的空间,但不集成其的使用权,只能通过父类的非私有方法进行访问父类私有成员
// 继承时的属性封装,private的继承全部封装到private作用域,protected 继承后非private数据全部为protected,public继承属性不变。
// 外界永远也别想访问父类的protected 和 private类的数据及方法
// 外界访问其继承数据时,根据其数据的作用域来决定是否拥有访问权


单论类生成对象的顺序

先处理程序的构造列表,然后对虚表赋值,然后执行函数代码;

1. 包含关系

class Fast
{
public:
        Fast():m_nData()
        {
                cout<<"virtual Fast()"<<endl;
        }
        virtual ~Fast()
        {
                cout<<"virtual ~Fast()"<<endl;
        }
public:
        int m_nData;
};


class Test
{
public:
        Test():m_nData(10)
        {
                cout<<"virtual Test()"<<endl;
        }
        virtual ~Test()
        {
                cout<<"virtual ~Test()"<<endl;
        }
public:
        Fast ff;   // 包含关系,初始化列表顺序同类内定义顺序
        int m_nData;
       
};

int main(int argc, char* argv[])
{
        Test tt;
        return 0;
}

此时构造列表同定义列表

004115CF   mov         dword ptr [ebp-10h],ecx
004115D2   mov         ecx,dword ptr [ebp-10h]
004115D5   add         ecx,4
004115D8   call        @ILT+60(Fast::Fast) (00401041)  // 若包含对象,且对象有构造一定出现在列表中,顺序跟定义时相同
004115DD   mov         dword ptr [ebp-4],0
004115E4   mov         eax,dword ptr [ebp-10h]
004115E7   mov         dword ptr [eax+0Ch],0Ah
004115EE   mov         ecx,dword ptr [ebp-10h]
004115F1   mov         dword ptr [ecx],offset Test::`vftable' (00428024)
87:           cout<<"virtual Test()"<<endl;

2. 继承关系

class Test : public Fast  当继承时,此时顺序就是一个定值了:

004115CF   mov         dword ptr [ebp-10h],ecx
004115D2   mov         ecx,dword ptr [ebp-10h]  // this 指针的位置 就是 ecx自身
004115D5   call        @ILT+60(Fast::Fast) (00401041)  // 先让父类赋虚表数值
004115DA   mov         dword ptr [ebp-4],0
004115E1   mov         eax,dword ptr [ebp-10h]
004115E4   mov         dword ptr [eax+8],0Ah
004115EB   mov         ecx,dword ptr [ebp-10h]
004115EE   mov         dword ptr [ecx],offset Test::`vftable' (00428024)  // 再让子类赋虚表数值



3. **游戏

来个**的,把数组当对象用,然后自己调用一下构造函数。

class Fast
{
public:
        Fast():m_nData(20)
        {
                cout<<this<<"virtual Fast()"<<endl;
        }
        virtual ~Fast()
        {
                cout<<this<<"virtual ~Fast()"<<endl;
        }
        void ShowMe()
        {
                cout<<"m_nData 数值为:"<<m_nData<<" "<<"哇哈哈!"<<endl;
        }
public:
        int m_nData;
};


class Test : public Fast
{
public:
        Test():m_nData(10)
        {
                cout<<this<<"virtual Test()"<<endl;
        }
        virtual ~Test()
        {
                cout<<this<<"virtual ~Test()"<<endl;
        }
public:
        //Fast ff;
        int m_nData;
       
};

int main(int argc, char* argv[])
{
        Test tt;  // 其构造地址为:00401037
        int a[4];
        int b;
        __asm
        {
                mov eax,0x00401037
                mov b,eax
                lea ecx,a
                call b    // 自己调用一下构造
        }
        cout<<"数组的地址为:"<<a<<endl;
        ((Test *)a)->ShowMe();
        __asm
        {
                mov eax,0x00401028
                mov b,eax
                lea ecx,a
                call b    // 自己调用一下析构
        }
        return 0;
}


0x0012FF44virtual Fast()
0x0012FF44virtual Test()
0x0012FF34virtual Fast()
0x0012FF34virtual Test()
数组的地址为:0x0012FF34
m_nData 数值为:20 哇哈哈!
0x0012FF34virtual ~Test()
0x0012FF34virtual ~Fast()
0x0012FF44virtual ~Test()
0x0012FF44virtual ~Fast()
Press any key to continue()
PYG19周年生日快乐!

该用户从未签到

发表于 2010-1-26 19:50:51 | 显示全部楼层
我无意间闯进来了。。。
话说,编译成Release还能用同样的方法调用么?/:012
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2010-1-26 21:07:04 | 显示全部楼层
应该是Ok的的 前提是函数的地址得自己找到 因为构造和析构的地址是无法使用指针来获取到的
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2010-1-26 21:14:42 | 显示全部楼层
原帖由 MicroAleX 于 2010-1-26 19:50 发表
我无意间闯进来了。。。
话说,编译成Release还能用同样的方法调用么?/:012


你小子最近混的咋样呀 也不上个Q连个人都摸不着
PYG19周年生日快乐!

该用户从未签到

发表于 2010-1-26 21:42:07 | 显示全部楼层
小宋?小宋映象中是不上Q的。。除非临时需要
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-8-23 14:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-1-26 22:04:45 | 显示全部楼层
    膜拜学习 and 抄袭一下 /:013
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-1-27 03:55:25 | 显示全部楼层
    构造顺序续:

    先父类
    在开始造列表(其中按成员在类的定义顺序赋初值)
    然后是填写续表
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-1-29 02:55:39 | 显示全部楼层
    原帖由 boy 于 2010-1-26 21:42 发表
    小宋?小宋映象中是不上Q的。。除非临时需要

    正解,有事要找我的话,最好打电话。。。如果不是急事,也可以E-Mail
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2010-1-29 16:31:35 | 显示全部楼层
    原帖由 MicroAleX 于 2010-1-29 02:55 发表

    正解,有事要找我的话,最好打电话。。。如果不是急事,也可以E-Mail



    哎 其实也没啥事 就是担心你吃不好住不好把不到妹妹 /:013
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2010-2-2 21:16:22 | 显示全部楼层
    原帖由 Nisy 于 2010-1-29 16:31 发表



    哎 其实也没啥事 就是担心你吃不好住不好把不到妹妹 /:013

    哎。为什么差距就那么大呢。
    你咋不稍微关心下我啊……
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表