没有合适的资源?快使用搜索试试~ 我知道了~
虚函数的原理,虚函数实现方式
需积分: 50 9 下载量 75 浏览量
2011-08-23
21:51:25
上传
评论
收藏 128KB PDF 举报
温馨提示
试读
2页
虚函数的原理,如果能够了解C++编译器对于虚函数的实现方式,我们就能够知道为什么虚函数可以做到动态绑定虚函数的原理,如果能够了解C++编译器对于虚函数的实现方式,我们就能够知道为什么虚函数可以做到动态绑定
资源推荐
资源详情
资源评论
MFC 深入分析 shuhuan2009@gmail.com
你一定很想知道虚函数是怎样做出来的,对不对?
如果能够了解 C++编译器对于虚函数的实现方式,我们就能够知道为什么虚函数可以做
到动态绑定。
为了达到动态绑定的目的,C++编译器通过某个表格,在执行期“间接”调用实际上欲
绑定的函数。这样的表格称为
虚函数表
(常被称为 vtable)。
每一个“内含虚函数的类”,编
译器都会为它做出一个虚函数表,表中每一个元素都指向一个虚函数的地址。此外,编译器
当然也会为类加上一项成员变量,是一个指向该虚函数表的指针(常被称为 vptr)
。
举例:
class Class1
{
public:
m_data1;
m_data2;
memfunc();
virtual vfunc1();
virtual vfunc2();
virtual vfunc3();
};
Class1 对象实例在内存中占据这样的空间:
每一个由此类派生出来的对象,都有这么一个 vptr。当我们通过这个对象调用虚函数
时,事实上是通过 vptr 找到虚函数表,再找出虚函数的真正地址
。
奥妙在于这个虚函数表以及这种间接调用方式。※【虚函数表的内容是依据类中的虚函
数声明次序,一一填入函数指针。派生类会继承基类的虚函数表(以及所有其它可以继承的
成员),当我们在派生类中改写虚函数时,虚函数表就受了影响:
表中元素所指的函数地址
将不再是基类的函数地址,而是派生类的函数地址
。】
举例:
class Class2 : public Class1
{
public:
m_data3;
memfunc();
virtual vfunc2();
};
vptr
m_data1
m_data2
(*vfunc1)()
(*vfunc2)()
(*vfunc3)()
Class1 对象实例
vtable
Class1::vfunc1()
Class1::vfunc2()
Class1::vfunc3()
资源评论
ithzhang
- 粉丝: 1966
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功