C++反汇编学习笔记-多重继承
来源:互联网 发布:php artisan 报错 编辑:程序博客网 时间:2024/05/22 05:05
class A{
public:
A(){ptr= "abcdefg";};
~A(){};
virtualvoid print(){
printf("%s\r\n",ptr);
}
virtualvoid printA(){
printf("A::%s\r\n",ptr);
}
public:
char*ptr;
};
class B:virtual public A{
public:
B(){ptr= "BBBBBBBBBBBBBBB";bv = 0xbbbbbbbb;}
~B(){};
virtualvoid print(){
printf("B::Print[%s]\r\n",ptr);
}
virtualvoid printB(){
printf("B::Print1[%s]\r\n",ptr);
}
public:
intbv;
};
class C:virtual public A{
public:
C(){ptr= "CCCCCCCCCCCCCCCCCCC";cv =0xcccccccc;}
~C(){};
virtualvoid print(){
printf("C::[%s][%s]\r\n",ptr,ptr);
}
virtualvoid printC(){
printf("C::[%s][%s]\r\n",ptr,ptr);
}
private:
intcv;
};
class D:public B,public C{
public:
D(){v=0xdddddddd;}
~D(){};
virtualvoid print(){
printf("D::[%s][%s]\r\n",A::ptr,B::ptr);
}
private:
intv;
};
上面例子是虚继承那么D的内存布局
B::Vfptr
D相对于B建立的虚函数表,其中不包括A虚函数
B::BToAOfsetPtr
B对象开始到A对象实体的偏移值的地址(B::BToAOfsetPtr+4)
B::MemberVerb
B成员变量
C::Vfptr
D相对于C建立的虚函数表,其中不包括A虚函数
C::CToAOfsetPtr
B对象开始到A对象实体的偏移值的地址(C::CToAOfsetPtr+4)
C::MemberVerb
C成员变量
D::MemberVerb
D成员变量
00000000
分隔
A:Vfptr
D相对于A建立的虚函数表
A::MemberVerb
A成员变量
注:在B和C对A覆盖的函数在D中一定要覆盖否则编译提示声明不确定;子对象实体到A对象实体的偏移地址要加4,那里的内容才是正确的。
class A{
public:
A(){ptr= "abcdefg";};
~A(){};
virtualvoid print(){
printf("%s\r\n",ptr);
}
virtualvoid printA(){
printf("A::%s\r\n",ptr);
}
public:
char*ptr;
};
class B {
public:
B(){ptr= "BBBBBBBBBBBBBBB"; }
~B(){};
virtualvoid print(){
printf("B::Print[%s]\r\n",ptr);
}
virtualvoid printB(){
printf("B::Print1[%s]\r\n",ptr);
}
public:
char*ptr;
};
class C: public A, public B{
public:
C(){cv=0xcccccccc;}
~C(){};
virtualvoid print(){
printf("C::[%s][%s]\r\n",A::ptr,B::ptr);
}
virtualvoid printC(){
printf("C::[%s][%s]\r\n",A::ptr,B::ptr);
}
private:
intcv;
};
class D:public B,public C{
public:
D(){v=0xdddddddd;}
~D(){};
virtualvoid print(){
printf("D::[%s][%s]\r\n",A::ptr,B::ptr);
}
private:
intv;
};
上面例子是虚继承那么D的内存布局:
A::Vfptr
D相对于A,C建立的虚函数表
A::MemberVerb
A成员变量
B::Vfptr
D相对于B,C建立的虚函数表
B::MemberVerb
B成员变量
C::MemberVerb
C成员变量
D::MemberVerb
D成员变量
注:当多个父类有同名成员时要指名作用域
关于析构:
类的析构函数要重设自己的虚拟函数表指针,是为了它被其它类继承时它作为一个父类,子类析构调用完后再调用它时可以屏蔽子类对自己的覆盖;因为这时子类部分的资源已经被释放,如果不重设虚拟函数表那么析构函数调用的函数如果被子类覆盖,则会调用子类的函数而不是它本身的。
- C++反汇编学习笔记-多重继承
- c反汇编学习汇编
- 反汇编学习笔记-数据类型
- Objective-C学习笔记---类别(实现多重继承的方法)
- Objective-C学习笔记---类别(实现多重继承的方法)
- 学习C++反汇编-单继承
- 学习C++反汇编-多继承
- 学习C++反汇编-菱形继承
- python学习笔记 多重继承
- 反汇编分析之:继承,多重继承,多层继承,父子类指针本质
- C++学习笔记-多重继承&虚拟继承
- c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA
- 反汇编看内存布局来研究vc2005中多重继承及虚函数
- C++学习笔记--多重继承的问题
- C++多重继承汇编分析
- c&c++反汇编与逆向分析学习笔记(1)--调试工具OllyDBG
- c&c++反汇编与逆向分析学习笔记(3)--基本数据类型表现形式
- c&c++反汇编与逆向分析学习笔记(4)--启动函数和用户入口
- Hbase SLF4J: Class path contains multiple SLF4J bindings 错误
- Oracle多表连接与子查询
- apache检测httpd.conf 配置文件错误行语句
- eX.osip3.0.1在Windows下编译方法及简单UA示例
- android action大全
- C++反汇编学习笔记-多重继承
- 二维码营销:智能手机引领的创新革命
- mysql5.6.10关于慢查询的设置slow-query-log
- vm linux网络配置(上网及跟主机连通)
- 存储学习之路
- 64位ubuntu无法安装 beyond compare 的解决方法
- freemarker 模版简介 if指令
- 设计UI的基本思路
- DllMain函数详解