C++学习笔记(11)——虚函数的特性
来源:互联网 发布:手机淘宝怎么看评分 编辑:程序博客网 时间:2024/05/23 11:36
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
虚函数的应用特性
例:编写三个类:没有虚函数、有一个虚函数、有两个虚函数,在主函数中定义这三个类的对象,分别取这个类所占的内存空间的大小,观察在内存中的分配;
代码如下:
/**//************************************************************************
* 虚函数的应用特性例子
************************************************************************/
#include <iostream.h>
//没有虚函数的类
class CNoVirtual
...{ int x;
public:
CNoVirtual(int nx)...{x=nx;}
void func() const...{}
int GetX() const ...{return x;}
};
//有一个虚函数的类
class COneVirtual
...{ int x;
public:
COneVirtual(int nx)...{x=nx;}
virtual void func() const...{}
int GetX()...{return x;}
};
//有两个虚函数的类
class CTwoCirtuals
...{ int x;
public:
CTwoCirtuals(int nx)...{x=nx;}
virtual void func() const...{}
virtual int GetX() const ...{return x;}
};
void main()
...{ CNoVirtual obj1(100);
COneVirtual obj2(200);
CTwoCirtuals obj3(300);
cout<<"size of types: ";
cout<<"int : "<<sizeof(int)<<endl;
cout<<"CNoVirtual : "<<sizeof(CNoVirtual)<<endl;
cout<<"void* : "<<sizeof(void*)<<endl;
cout<<"COneVirtual : "<<sizeof(COneVirtual)<<endl;
cout<<"CTwoVirtual : "<<sizeof(CTwoCirtuals)<<endl;
}
* 虚函数的应用特性例子
************************************************************************/
#include <iostream.h>
//没有虚函数的类
class CNoVirtual
...{ int x;
public:
CNoVirtual(int nx)...{x=nx;}
void func() const...{}
int GetX() const ...{return x;}
};
//有一个虚函数的类
class COneVirtual
...{ int x;
public:
COneVirtual(int nx)...{x=nx;}
virtual void func() const...{}
int GetX()...{return x;}
};
//有两个虚函数的类
class CTwoCirtuals
...{ int x;
public:
CTwoCirtuals(int nx)...{x=nx;}
virtual void func() const...{}
virtual int GetX() const ...{return x;}
};
void main()
...{ CNoVirtual obj1(100);
COneVirtual obj2(200);
CTwoCirtuals obj3(300);
cout<<"size of types: ";
cout<<"int : "<<sizeof(int)<<endl;
cout<<"CNoVirtual : "<<sizeof(CNoVirtual)<<endl;
cout<<"void* : "<<sizeof(void*)<<endl;
cout<<"COneVirtual : "<<sizeof(COneVirtual)<<endl;
cout<<"CTwoVirtual : "<<sizeof(CTwoCirtuals)<<endl;
}
1. 运行结果:
2. 对象的内存分配情况:
3. 对象的地址及内容:
4. 对象的成员变量的地址及内容:
综上,对象的内存空间分配情况如下:
说明:
从上面的结果可以看到,没有虚函数的类CNoVirtual的大小正好是其成员变量——一个整型数据的大小,而有一个虚函数和两个虚函数的类的大小还要加上一个紧缩的空指针类型的大小。这说明了在包含虚函数的类中,编译系统自动加入了一些表明类型的信息。
当一个类中拥有虚函数时,编译系统将为该类创建一个数组VTABLE。VTABLE数组中的元素是虚函数的地址,且同一虚函数的地址在基类和派生类的VTABLE中相对首位置的偏移是一样的。同时,编译系统还加入了相应的调用虚函数的代码。所有这些都是不需要程序员作的工作,由系统自动完成。在初始化该类对象时,将加入一个指向VTABLE的指针,这个指针一般称为VPTR。一般来说,VPTR位于该类对象的存储单元的最开始部位,如上图所示。
这样,当VPTR被正确的初始化之后,便指向了该对象的VTABLE,从而在对象及其特定的虚函数定义间建立了联系。从虚函数调用的意义上来说,VPTR表明了类型信息,因为它使得调用与类型相符合。
从上面的结果可以看到,没有虚函数的类CNoVirtual的大小正好是其成员变量——一个整型数据的大小,而有一个虚函数和两个虚函数的类的大小还要加上一个紧缩的空指针类型的大小。这说明了在包含虚函数的类中,编译系统自动加入了一些表明类型的信息。
当一个类中拥有虚函数时,编译系统将为该类创建一个数组VTABLE。VTABLE数组中的元素是虚函数的地址,且同一虚函数的地址在基类和派生类的VTABLE中相对首位置的偏移是一样的。同时,编译系统还加入了相应的调用虚函数的代码。所有这些都是不需要程序员作的工作,由系统自动完成。在初始化该类对象时,将加入一个指向VTABLE的指针,这个指针一般称为VPTR。一般来说,VPTR位于该类对象的存储单元的最开始部位,如上图所示。
这样,当VPTR被正确的初始化之后,便指向了该对象的VTABLE,从而在对象及其特定的虚函数定义间建立了联系。从虚函数调用的意义上来说,VPTR表明了类型信息,因为它使得调用与类型相符合。
- C++学习笔记(11)——虚函数的特性
- PHP学习笔记——each()函数的特性
- C++11新特性学习笔记—继承构造函数的使用
- C++11新特性学习笔记—委托构造函数的使用
- 一步一步学习C++(类)之成员函数的特性
- PHP学习笔记——新特性匿名函数
- GEEK学习笔记— —C++11的新特性
- Objective-C学习总结#1——函数与变量的语法特性
- 函数的高阶特性——Python学习笔记04
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之13-基本的C语言特性——黑马 IOS 技术博客
- 多态性与虚函数——C/C++学习笔记
- c语言学习笔记(8)——函数
- Objective-C学习笔记(十三)——函数的声明与调用
- Objective-C学习笔记(二十一)——函数的返回值与参数类型
- Object-c的三大特性 学习笔记
- .Net C#(类的继承/虚函数/抽象函数/密封类/静态类/抽象类)——学习笔记
- PHP学习笔记——数组声明的特性
- JAVA学习笔记——JDK5的新特性
- 二叉树的建立和打印
- 快车flashget中打造另类收藏夹
- ubuntu 7.10 with alsa-1.0.14 无法识别Intel ICH9 HD Audio Controller的问题
- 我对"许霆案"的思考
- Fedora 9 预告:集GNU/Linux最新组件和技术于一身
- C++学习笔记(11)——虚函数的特性
- JSTL 入门: 探讨 core
- SQL截取一个字段中不确定字母和数字并按照数字顺序排序
- 反对OOXML,为何失利?
- 网页CSS样式表设计十条技巧
- 建议研究全国人民每人发放1000元以分享财政收入高增长的提案
- 关于应用程序远程连接 MS SQL 2000
- C++环境搭建(Eclipse+CDT+MinGW)
- 用AjaxPro实现定时刷新效果