c++晚捆绑的实现机制
2016-05-26 12:28
344 查看
早绑定(early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。
晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。
早绑定的优点是:
(1) 编译效率 高
(2) 有代码提示
(3) 编译时类型检查
晚绑定的优点是:
(1) 不用申明类型
(2) 对象类型可以随时更改
virtual关键字可以告诉编译器实行的是晚捆绑(虚函数)。
为了实现晚捆绑,典型的编译器对每个包含虚函数的类将创建一个表(VTABLE),在VTABLE中放着特定类的虚函数地址。在每个带有虚函数的类中,编译器会放置一个指针VPTR,指向这个对象的VTABLE。当通过基类指针做虚函数调用时,编译器静态的插入能取得这个VPTR并在VTAVLE表中查找函数地址的代码,这样就会引起晚捆绑的发生。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class NoVirtual
{
public:
void fun()
{}
int ret()
{}
private:
int a;
};
class OneVirtual
{
public:
virtual void fun()
{}
int ret()
{}
private:
int a;
};
class TwoVirtual
{
public:
virtual void fun()
{}
virtual int ret()
{}
private:
int a;
};
void test()
{
cout << "sizeof(int):" << sizeof(int) << endl;
cout << "sizeof(NoVirtual):" << sizeof(NoVirtual) << endl;
cout << "sizeof(OneVirtual):" << sizeof(OneVirtual) << endl;
cout << "sizeof(TwoVirtual):" << sizeof(TwoVirtual) << endl;
}
int main()
{
test();
system("pause");
return 0;
}
由于类Onevirtual和类Twovirtual的大小没有发生改变,所以可以推出上述的结论。
本文出自 “fun” 博客,请务必保留此出处http://10725723.blog.51cto.com/10715723/1782205
晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。
早绑定的优点是:
(1) 编译效率 高
(2) 有代码提示
(3) 编译时类型检查
晚绑定的优点是:
(1) 不用申明类型
(2) 对象类型可以随时更改
virtual关键字可以告诉编译器实行的是晚捆绑(虚函数)。
为了实现晚捆绑,典型的编译器对每个包含虚函数的类将创建一个表(VTABLE),在VTABLE中放着特定类的虚函数地址。在每个带有虚函数的类中,编译器会放置一个指针VPTR,指向这个对象的VTABLE。当通过基类指针做虚函数调用时,编译器静态的插入能取得这个VPTR并在VTAVLE表中查找函数地址的代码,这样就会引起晚捆绑的发生。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class NoVirtual
{
public:
void fun()
{}
int ret()
{}
private:
int a;
};
class OneVirtual
{
public:
virtual void fun()
{}
int ret()
{}
private:
int a;
};
class TwoVirtual
{
public:
virtual void fun()
{}
virtual int ret()
{}
private:
int a;
};
void test()
{
cout << "sizeof(int):" << sizeof(int) << endl;
cout << "sizeof(NoVirtual):" << sizeof(NoVirtual) << endl;
cout << "sizeof(OneVirtual):" << sizeof(OneVirtual) << endl;
cout << "sizeof(TwoVirtual):" << sizeof(TwoVirtual) << endl;
}
int main()
{
test();
system("pause");
return 0;
}
由于类Onevirtual和类Twovirtual的大小没有发生改变,所以可以推出上述的结论。
本文出自 “fun” 博客,请务必保留此出处http://10725723.blog.51cto.com/10715723/1782205
相关文章推荐
- c++实现线性表
- c语言实现线性表
- 用c语言实现折半查找函数
- 用C语言打印一个菱形
- [置顶] 【C语言】 字符串操作函数及内存拷贝函数归总
- [置顶] 【C++】 斐波那契数列
- [置顶] 【C++】 浅析智能指针
- [置顶] 【C++】 浅析异常
- [置顶] 【C++】 浅析深浅拷贝
- [置顶] 【C++】 双向链表.cpp
- [置顶] 【C++】 单链表 .cpp
- [置顶] 【C++】 复数类操作
- [置顶] 【c语言】 单链表
- [置顶] 【c语言】 单链表
- [置顶] 【C语言】 简易通讯录
- [置顶] 【C语言】 动态开辟二维数组
- [置顶] 【C语言】 使用回调函数实现冒泡排序
- [置顶] 【C语言】 函数指针小谈
- [置顶] 【C语言】 模拟计算器
- [置顶] 【C语言】 浅谈指针