如何理解虚表及其计算含虚函数的类的大小
2016-04-21 16:31
621 查看
在什么情况下系统会自动生成缺省(默认)的构造函数?
1、在类里面有一个类类型的对象,这个类有自己的缺省构造函数(有缺省的参数,参数有缺省值)。
class B
{
B(int data)
{ }
};不能合成
class B
{
B(int data=0)
{ }
};会合成
class B
{
public:
B(int data=0)
{ }
};
class C:public B
{
public:
C()
:B(0)
{ }
B b; //编译器会自动合成
};
2、类是虚拟继承
class B
{
public:
B()
{}
};
class D:virtual public B
{
public:
D()
{ }
B b;
};
3、基类有缺省构造函数,子类没有显示定义自己的构造函数
class B
{
public:
B(int data=0)
{}
};
class D: public B
{
public:
};
4、有虚函数的类,系统自动生成缺省的构造函数来初始化虚指针
class B
{
public:
virtual void fun()
{
cout << "fun" << endl;
}
};
前面是一些构造函数方面的总结,菜鸟一个写的太烂,进来的先凑合着看,会不定时补充,有错误的地方还请多多指点
****************************************************************************************
虚函数:
class Base
{
public:
virtual void FunTest()
{
cout << "Base::FunTest()" << endl;
}
virtual void FunTest1()
{
cout << "Base::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Base::FunTest2()" << endl;
}
virtual void FunTest3()
{
cout << "Base::FunTest3()" << endl;
}
virtual void FunTest4()
{
cout << "Base::FunTest4()" << endl;
}
};
int main()
{
Base b;
system("pause");
return 0;
}
Base b;
009253E8 lea ecx,[b]
009253EB call Base::Base (0921226h)
有call命令说明编译器有合成缺省构造函数
取b的地址,b指向的那块空间里存放着另一个地址,该地址指向的空间存放着虚表地址
虚指针指向虚表
虚表的顺序和函数的声明顺序是一样的
虚函数的大小:
***************************计算大小*********************************
class C
{
public:
char a; //1
static char b; //静态成员在静态区域,不在栈区,所以不算
void *p; //指针占4个字节
static int *c; //静态成员在静态区域,不在栈区,所以不算
virtual void func1()
{}
virtual void func2()
{}
//虚函数属于同一类,故只需要一个这个指针指向虚函数表,
//占用4个字节,就算有N个虚函数,也是4个字节
};
int main()
{
C c;
cout << sizeof(C) << endl; //12
cout << sizeof(c.a) << endl; //1
cout << sizeof(c.b) << endl; //1 类型的大小
cout << sizeof(c.c) << endl; //4 类型的大小
cout << sizeof(c.p) << endl; //4
return 0;
}
1、在类里面有一个类类型的对象,这个类有自己的缺省构造函数(有缺省的参数,参数有缺省值)。
class B
{
B(int data)
{ }
};不能合成
class B
{
B(int data=0)
{ }
};会合成
class B
{
public:
B(int data=0)
{ }
};
class C:public B
{
public:
C()
:B(0)
{ }
B b; //编译器会自动合成
};
2、类是虚拟继承
class B
{
public:
B()
{}
};
class D:virtual public B
{
public:
D()
{ }
B b;
};
3、基类有缺省构造函数,子类没有显示定义自己的构造函数
class B
{
public:
B(int data=0)
{}
};
class D: public B
{
public:
};
4、有虚函数的类,系统自动生成缺省的构造函数来初始化虚指针
class B
{
public:
virtual void fun()
{
cout << "fun" << endl;
}
};
前面是一些构造函数方面的总结,菜鸟一个写的太烂,进来的先凑合着看,会不定时补充,有错误的地方还请多多指点
****************************************************************************************
虚函数:
class Base
{
public:
virtual void FunTest()
{
cout << "Base::FunTest()" << endl;
}
virtual void FunTest1()
{
cout << "Base::FunTest1()" << endl;
}
virtual void FunTest2()
{
cout << "Base::FunTest2()" << endl;
}
virtual void FunTest3()
{
cout << "Base::FunTest3()" << endl;
}
virtual void FunTest4()
{
cout << "Base::FunTest4()" << endl;
}
};
int main()
{
Base b;
system("pause");
return 0;
}
Base b;
009253E8 lea ecx,[b]
009253EB call Base::Base (0921226h)
有call命令说明编译器有合成缺省构造函数
取b的地址,b指向的那块空间里存放着另一个地址,该地址指向的空间存放着虚表地址
虚指针指向虚表
虚表的顺序和函数的声明顺序是一样的
虚函数的大小:
***************************计算大小*********************************
class C
{
public:
char a; //1
static char b; //静态成员在静态区域,不在栈区,所以不算
void *p; //指针占4个字节
static int *c; //静态成员在静态区域,不在栈区,所以不算
virtual void func1()
{}
virtual void func2()
{}
//虚函数属于同一类,故只需要一个这个指针指向虚函数表,
//占用4个字节,就算有N个虚函数,也是4个字节
};
int main()
{
C c;
cout << sizeof(C) << endl; //12
cout << sizeof(c.a) << endl; //1
cout << sizeof(c.b) << endl; //1 类型的大小
cout << sizeof(c.c) << endl; //4 类型的大小
cout << sizeof(c.p) << endl; //4
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- c#中虚函数的相关使用方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解