对象多继承中的数据结构分析
来源:互联网 发布:云计算主题基金 编辑:程序博客网 时间:2024/04/30 22:23
为了探索类继承数据结构,构造如下几个类:
Class BaseA:
Class BaseB public BaseA
Class BaseC
Class BaseD
Class BaseE public BaseC, public BaseD
Class DriveF public BaseB, public BaseE
代码:
#include <iostream> using namespace std; class BaseA { public: BaseA() {cout << "In BaseA/n";} virtual void fa() { cout << "BaseA::fa/n"; } virtual void faa() { cout << "BaseA::faa/n"; } int a; }; class BaseB : public BaseA { public: BaseB () {cout << "In BaseB /n"; } virtual void fb() { cout << "BaseB ::fb/n"; } virtual void fbb() { cout << "BaseB ::fbb/n"; } int b; }; class BaseC { public: BaseC () {cout << "In BaseC /n";} virtual void fc() { cout << "BaseC ::fc/n"; } virtual void fcc() { cout << "BaseC ::fcc/n"; } int c; }; class BaseD { public: BaseD() {cout << "In BaseD/n";} virtual void fd() { cout << "BaseD::fd/n"; } virtual void fdd() { cout << "BaseD::fdd/n"; } int d; }; class BaseE : public BaseC , public BaseD { public: BaseE() {cout << "In BaseE/n"; } virtual void fe() { cout << "BaseE::fe/n"; } virtual void fee() { cout << "BaseE::fee/n"; } int e; }; class DriveF : public BaseB , public BaseE { public: DriveF(){cout << "In DriveF/n";} virtual void ff(){cout << "DriveF::ff/n"; } virtual void fff(){cout << "DriveF::fff/n"; } int f; }; typedef void(*F)(void); int main(void) { cout << "/n创建BaseA对象/n"; BaseA ba; ba.a = 9; int *pob = (int*)(&ba) ; //对象地址 int *pvt = (int*)(*pob) ; //对象的虚表地址 F f = F( *pvt ); //虚表第一个虚函数 f(); f = F( *(pvt+1) ); //虚表第二个虚函数 f(); cout << "BaseA.a = " << *(pob+1) << "/n"; //数据成员a cout << "/n创建BaseB 对象/n"; BaseB bb; bb.a = 8; bb.b=7; pob = (int*)(&bb) ; //对象地址 pvt = (int*)(*pob) ; // BaseB虚表 f = F( *pvt ); //BaseA第一个虚函数 f(); f = F( *(pvt+1) ); //BaseA第二个虚函数 f(); f = F( *(pvt+2) ); //BaseB虚表第一个虚函数 f(); f = F( *(pvt+3) ); //BaseB虚表第二个虚函数 f(); cout << "BaseB.BaseA.a = " << *(pob+1) << "/n"; //BaseA数据成员a cout <<"BaseB.b = " <<*(pob+2 ) << "/n"; //BaseB数据成员b cout << "/n创建DriveF对象/n"; DriveF df; df.a = 1, df.b = 2; df.c = 3; df.d = 4; df.e = 5; df.f = 6; pob = (int*)(&df) ; //对象地址 pvt = (int*)(*pob) ; //对象的虚表地址 F f4 = F( *pvt ); //BaseA 第一个虚函数 f4(); f4 = F( *(pvt+1) ); //BaseA 第二个虚函数 f4(); F f5 = F( *(pvt+2) ); // BaseB 第一个虚函数 f5(); f5 = F( *(pvt+3) ); // BaseB 第二个虚函数 f5(); F f6 = F( *(pvt+4) ); //DriveF 第一个虚函数 f6(); f6 = F( *(pvt+5) ); //DriveF 第二个虚函数 f6(); F f7 = F( *(int*)*(pob+3) ); //BaseC 第一个虚函数 f7(); f7 = F( *((int*)*(pob+3)+1) ); //BaseC 第二个虚函数 f7(); F f8 = F( *(int*)*(pob+5) ); //BaseD 第一个虚函数 f8(); f8 = F( *((int*)*(pob+5)+1) ); //BaseD 第二个虚函数 f8(); F f9 = F( *( (int*)*(pob+3)+2 ) ); //BaseE 第一个虚函数 f9(); f9 = F( *( (int*)*(pob+3)+3 ) ); //BaseE 第二个虚函数 f9(); cout <<"DriveF.BaseB.BaseA.a = "<< *(pob+1) << "/n";//BaseA数据成员a cout <<"DriveF.BaseB.b = " <<*(pob+2 ) << "/n"; //BaseB数据成员b cout <<"DriveF.BaseC.c = " <<*(pob+4) << "/n"; //BaseC 数据成员c cout <<" DriveF.BaseD.d = " <<*(pob+6) << "/n"; //BaseD数据成员d cout <<" DriveF.BaseE.e = " <<*(pob+7) << "/n"; //BaseE数据成员e cout <<"DriveF.f = " <<*(pob+8) << "/n"; //DriveF数组成员f return 0; }
结论图示:
- 对象多继承中的数据结构分析
- 面向对象中的继承与多态
- perl 中的面向对象多继承
- 继承中的对象模型
- 继承中的对象模型
- 面向对象中的继承
- 多继承中的内存分析示例
- JavaScript中的面向对象----继承
- Java面向对象中的继承
- java 面向对象中的继承
- C++ 继承中的对象模型
- Microsoft Visual C++虚拟多继承 对象模型初步分析
- Microsoft Visual C++虚拟多继承 对象模型初步分析
- 面向对象编程中的多态和继承
- 黑马程序员-面向对象中的继承与多态
- 面向对象_多态继承中的内存图解
- java面向对象中的封装、继承和多态
- java中的面向对象(封装、继承和多态)
- [转帖自沪江]灵指神探
- FFmpeg开发指南-第0篇
- ASP获取远程的计算机名
- 很长时间没发东西了,最近真的很累
- 使用Jacob将Word转为Html或txt
- 对象多继承中的数据结构分析
- [linux]-解决Evince中文乱码问题
- save函数 与 load函数
- Google的蜘蛛模拟器
- Ubuntu 9.10 Alpha 3 “KarmicKoala”
- MP3开源项目第一次讨论结果
- 精妙Sql语句(总结以前的所有精华)
- C 指针
- 加入进度条及进度框