C++学习笔记3(类在内存中的结构)
时间:2011-04-03 来源:Joen
如果需要逆向C++的代码, 首先应该明白各个类是怎么布局的, 当然首先要确定你所逆向的代码是C++写的, 这个就比较简单了, 一般C++写的代码都大量的使用了this指针, 有的时候会觉得非常古怪的代码, 比如mov ecx, esi call ***** 这种代码, 一般只有在C++里面才有.. 由上面这个代码就可以确定. 其在 调用构造函数, 并且是无参数那个. 还是看看一个这个比较有营养的东西,这个程序有点长, 我定义了好几种类型的对象, 一个一个试验, 看看到底是什么款式...首先看看源代码, 我编译是在Vs2008下 编译的, 命令行是cl /c /EHsc xxx.cpp 没有加其他特性..
#include <iostream>
/*
这个程序基本C++一些特性都给用上了, 我们看看这个程序在内存中到底是什么样的
*/
using namespace std;
class CPerson {
private:
int m_data;
public:
CPerson():m_data(0) {
cout << "CPerson Constructor" << endl;
}
virtual void Out() {
cout << "CPerson-->Out" << endl;
}
void Out2() {
cout << "CPerson-> Out2" << endl;
}
~CPerson() {
cout << "CPerson Destructor" << endl;
}
};
class CVampire: public CPerson {
private:
int m_data;
public:
CVampire():m_data(0) {
cout << "CVampire Constructor" << endl;
}
void Out() {
cout << "CVampire" << endl;
}
void Out2() {
cout << "CVampire Out2" << endl;
}
~CVampire() {
cout << "CVamprie Destructor" << endl;
}
};
class CGhost: public CPerson {
private:
int m_data;
public:
CGhost(): m_data(0){
cout << "CGhost Constructor " << endl;
}
void Out() {
cout << "CGhost" << endl;
}
~CGhost() {
cout << "CGhost Destructor" << endl;
}
};
//这个多重继承比较郁闷啊, CVampire本来就是从CPerson继承的, 自己又去继承
//呵呵这里演示看看到底什么效果
class CLivingDead:public CPerson, CVampire {
private:
int m_data;
public:
CLivingDead(int i, int j ){
this->m_data = i;
cout << "CLivingDead Constructor" << endl;
}
~CLivingDead(){
cout << "CLivingDead Destructor" << endl;
}
};
int main() {
CPerson* cp = new CVampire(); //在堆上分配
CGhost cg;
CPerson* cp2 = &cg; //基类引用指向子类对象
cp->Out();
cp2->Out();
CVampire cv; //栈上定义一个对象
cv.Out2();
CLivingDead cl(10, 20 ); //栈上定义一个对象
CPerson* cl2 = new CLivingDead( 100, 200 );
cp2 = &cl;
cp2->Out();
cp2->Out2();
cl2->Out();
cl2->Out2();
delete cp;
delete cl2;
return 0;
}
对照着源码来看看反汇编是什么情况..
相关阅读 更多 +