虚表的地址与虚继承类大小的计算
来源:互联网 发布:linux自动挂载 编辑:程序博客网 时间:2024/06/04 00:48
虚函数列表在程序编译的时候已经存在;
虚指针在new对象时生成,虚指针的大小与虚函数的多少没有关系,所有的虚函数都放在虚函数列表里,通过虚指针来查找!
虚函数列表的地址就是对象的首地址;
typedef void (*FUN)();
如:father *f=new father;
father ff;
假如father有虚函数;
则虚函数列表的地址为:
*(int *)*(int *)f; 或者
*(int *)*(int *)(&ff)
这就是虚函数列表的首地址;
依次取出就是:
FUN a= (FUN)(*((int *)*(int *)f+1);//第二个虚函数的地址;
调用:a();
或者:
FUN b=(FUN)(*((int *)*(int *)(&ff)+2);//第三个虚函数的地址;
调用:b();
虚继承的大小的计算:
例一:
#include <iostream>#include <memory.h>#include <assert.h>using namespace std;class A //3+虚指针==8,最大字节对齐;{char k[3];public:virtual void aa(){};};class B : public A //k3+j3+虚指针(最大字节对齐)=12;{char j[3];public:virtual void bb(){};};class C : public B //k3+j3+i3+虚指针(最大字节对齐)=16;{char i[3];public:virtual void cc(){};};int main(int arge,char *argv[]){cout<<"sizeof(A):"<<sizeof(A)<<endl; //8cout<<"sizeof(B):"<<sizeof(B)<<endl; //12cout<<"sizeof(C):"<<sizeof(C)<<endl; //16system("pause");return 0;}
例二:
#include <iostream>#include <memory.h>#include <assert.h>using namespacestd;class A //3+虚指针==8,最大字节对齐;{ char k[3];public: virtual void aa(){};}; //虚继承所指向的虚基类的指针和new对象时产生的查找虚函数列表的指针不一样;class B : public virtual A //k3+j3+虚指针+指向父类的指针(最大字节对齐)=12+4;{ char j[3];public: virtual void aa(){};};class C : public virtual B //k3+j3+i3+虚指针+指向A类的虚指针+指向B类的虚指针(最大字节对齐)=16+8;{ char i[3];public: virtual void aa(){};};int main(int arge,char *argv[]){ cout<<"sizeof(A):"<<sizeof(A)<<endl; //8 cout<<"sizeof(B):"<<sizeof(B)<<endl; //16 cout<<"sizeof(C):"<<sizeof(C)<<endl; //24 system("pause"); return 0;}
例三
#include <iostream>#include <memory.h>#include <assert.h>using namespace std;class A{char k[3];public:virtual void aa(){};};class B : public virtual A{char j[3];public:virtual void bb(){};};class C : public virtual B{char i[3];public:virtual void bb(){}; //没有新的虚函数,所以没有自己的虚函数列表;virtual void aa(){}; //都是重写虚基类的函数;};int main(int arge,char *argv[]){cout<<"sizeof(A):"<<sizeof(A)<<endl; //8cout<<"sizeof(B):"<<sizeof(B)<<endl;//20cout<<"sizeof(C):"<<sizeof(C)<<endl;//28system("pause");return 0;}
有虚继承和虚函数的时候要看自己这个类里有没有新的虚函数有就多一个指向自己的虚函数列表的指针!!!
4 0
- 虚表的地址与虚继承类大小的计算
- 继承、虚继承的类的格式与大小
- C++类对象大小的计算(三)含有虚函数、虚继承类大小计算
- 怎样计算C++继承、虚继承、虚函数类的大小
- 怎样计算C++继承、虚继承、虚函数类的大小
- 使用sizeof计算虚继承的类对象的空间大小
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- JAVA+Selenium环境配置进行web页功能自动化的测试
- 关于mysql事件处理的方法
- JAVA中HashMap如何删除元素
- 产品经理从娃娃抓起
- CodeForces 173A Rock-Paper-Scissors(数论)
- 虚表的地址与虚继承类大小的计算
- 01_AsyncTask基本使用
- Hibernate 缓存机制详细解析
- 稳定排序之归并排序
- 【数据结构与算法01】数组
- POJ 2392 Space Elevator(多重背包)
- leetcode 2: Add Two Numbers (C#语言版)
- javascript 获取域名和页面地址
- CF 预处理