哇哈哈构造(包含关系、继承关系、用数组模拟对象)
// 继承时只继承父类私有成员的空间,但不集成其的使用权,只能通过父类的非私有方法进行访问父类私有成员// 继承时的属性封装,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() 我无意间闯进来了。。。
话说,编译成Release还能用同样的方法调用么?/:012 应该是Ok的的 前提是函数的地址得自己找到 因为构造和析构的地址是无法使用指针来获取到的 原帖由 MicroAleX 于 2010-1-26 19:50 发表 https://www.chinapyg.com/images/common/back.gif
我无意间闯进来了。。。
话说,编译成Release还能用同样的方法调用么?/:012
你小子最近混的咋样呀 也不上个Q连个人都摸不着 小宋?小宋映象中是不上Q的。。除非临时需要 膜拜学习 and 抄袭一下 /:013 构造顺序续:
先父类
在开始造列表(其中按成员在类的定义顺序赋初值)
然后是填写续表 原帖由 boy 于 2010-1-26 21:42 发表 https://www.chinapyg.com/images/common/back.gif
小宋?小宋映象中是不上Q的。。除非临时需要
正解,有事要找我的话,最好打电话。。。如果不是急事,也可以E-Mail 原帖由 MicroAleX 于 2010-1-29 02:55 发表 https://www.chinapyg.com/images/common/back.gif
正解,有事要找我的话,最好打电话。。。如果不是急事,也可以E-Mail
哎 其实也没啥事 就是担心你吃不好住不好把不到妹妹 /:013 原帖由 Nisy 于 2010-1-29 16:31 发表 https://www.chinapyg.com/images/common/back.gif
哎 其实也没啥事 就是担心你吃不好住不好把不到妹妹 /:013
哎。为什么差距就那么大呢。
你咋不稍微关心下我啊……
页:
[1]