c++晚捆绑的实现机制
早绑定(early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。
晚绑定(late binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。
早绑定的优点是:
(1) 编译效率 高
(2) 有代码提示
(3) 编译时类型检查
晚绑定的优点是:
(1) 不用申明类型
(2) 对象类型可以随时更改
virtual关键字可以告诉编译器实行的是晚捆绑(虚函数)。
为了实现晚捆绑,典型的编译器对每个包含虚函数的类将创建一个表(VTABLE),在VTABLE中放着特定类的虚函数地址。在每个带有虚函数的类中,编译器会放置一个指针VPTR,指向这个对象的VTABLE。当通过基类指针做虚函数调用时,编译器静态的插入能取得这个VPTR并在VTAVLE表中查找函数地址的代码,这样就会引起晚捆绑的发生。
#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;classNoVirtual{public:voidfun(){}intret(){}private:inta;};classOneVirtual{public:virtualvoidfun(){}intret(){}private:inta;};classTwoVirtual{public:virtualvoidfun(){}virtualintret(){}private:inta;};voidtest(){cout<<"sizeof(int):"<<sizeof(int)<<endl;cout<<"sizeof(NoVirtual):"<<sizeof(NoVirtual)<<endl;cout<<"sizeof(OneVirtual):"<<sizeof(OneVirtual)<<endl;cout<<"sizeof(TwoVirtual):"<<sizeof(TwoVirtual)<<endl;}intmain(){test();system("pause");return0;}
由于类Onevirtual和类Twovirtual的大小没有发生改变,所以可以推出上述的结论。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。