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

2. 继承关系

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

004115CF   mov         dword ptr ,ecx
004115D2   mov         ecx,dword ptr // this 指针的位置 就是 ecx自身
004115D5   call      @ILT+60(Fast::Fast) (00401041)// 先让父类赋虚表数值
004115DA   mov         dword ptr ,0
004115E1   mov         eax,dword ptr
004115E4   mov         dword ptr ,0Ah
004115EB   mov         ecx,dword ptr
004115EE   mov         dword ptr ,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;
        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()

MicroAleX 发表于 2010-1-26 19:50:51

我无意间闯进来了。。。
话说,编译成Release还能用同样的方法调用么?/:012

Nisy 发表于 2010-1-26 21:07:04

应该是Ok的的 前提是函数的地址得自己找到 因为构造和析构的地址是无法使用指针来获取到的

Nisy 发表于 2010-1-26 21:14:42

原帖由 MicroAleX 于 2010-1-26 19:50 发表 https://www.chinapyg.com/images/common/back.gif
我无意间闯进来了。。。
话说,编译成Release还能用同样的方法调用么?/:012

你小子最近混的咋样呀 也不上个Q连个人都摸不着

boy 发表于 2010-1-26 21:42:07

小宋?小宋映象中是不上Q的。。除非临时需要

MeowCat 发表于 2010-1-26 22:04:45

膜拜学习 and 抄袭一下 /:013

Nisy 发表于 2010-1-27 03:55:25

构造顺序续:

先父类
在开始造列表(其中按成员在类的定义顺序赋初值)
然后是填写续表

MicroAleX 发表于 2010-1-29 02:55:39

原帖由 boy 于 2010-1-26 21:42 发表 https://www.chinapyg.com/images/common/back.gif
小宋?小宋映象中是不上Q的。。除非临时需要
正解,有事要找我的话,最好打电话。。。如果不是急事,也可以E-Mail

Nisy 发表于 2010-1-29 16:31:35

原帖由 MicroAleX 于 2010-1-29 02:55 发表 https://www.chinapyg.com/images/common/back.gif

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


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

boy 发表于 2010-2-2 21:16:22

原帖由 Nisy 于 2010-1-29 16:31 发表 https://www.chinapyg.com/images/common/back.gif



哎 其实也没啥事 就是担心你吃不好住不好把不到妹妹 /:013
哎。为什么差距就那么大呢。
你咋不稍微关心下我啊……
页: [1]
查看完整版本: 哇哈哈构造(包含关系、继承关系、用数组模拟对象)