- UID
- 2198
注册时间2005-6-29
阅读权限255
最后登录1970-1-1
副坛主
该用户从未签到
|
// 继承时只继承父类私有成员的空间,但不集成其的使用权,只能通过父类的非私有方法进行访问父类私有成员
// 继承时的属性封装,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() |
|