在面向对象c++编程中,多态是oo三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。
该类对象安插一个虚函数表指针,并为类(基类和派生类)设置虚函数表,虚函数表中存放的是该类虚函数地址。同时,改写虚函数调用代码(函数指针调用)。运行期间通过虚函数表指针与虚函数表去确定该类虚函数的真正实现。
#includeusing namespace std;class animal{public :virtual void shout() = 0;};class dog :public animal{public:virtual void shout(){ cout << 汪汪!<
shout();delete anim3;system(pause);return 0;}/*汪汪!喵喵~叽喳!*/编译器会构建一张虚表( vtable ),每一个类都有自己独特的虚表。同时,在这个继承链上,编译器会为基类插入一个隐式的指针(一般是对象的首地址),指向虚表,称为__vptr。然后,子类继承父类时,会获得继承下来的__vptr,再根据自己的类的情况兼容(修改虚函数表里的值、发生偏移等。于是,当我们构建具体的类时,若是基类类型,__vptr就会指向父类的vtable,若是子类类型,__vptr就会指向子类的vtable。
下面再看一个实例来了解虚函数表,及对象的函数指针是如何指向虚函数表以及调用虚函数代码是如何改写的?
#include using namespace std;class a{public: a(int _a1 = 1) : a1(_a1) { } virtual void f() { cout << a::f << endl; } virtual void g() { cout << a::g << endl; } virtual void h() { cout << a::h << endl; } ~a() {}private: int a1;};class c : public a{public: c(int _a1 = 1, int _c = 4) :a(_a1), c(_c) { } virtual void f() { cout << c::f << endl; } virtual void g() { cout << c::g << endl; } virtual void h() { cout << c::h << endl; }private: int c;};// 通过访问类对象的前4字节(32位编译器)找到虚函数表。// 虚函数表最后一项用的是0,代表虚函数表结束。typedef void(*func)(); //重定义函数指针,指向函数的指针void printvtable(long* vtable) //访问虚函数表{ if (vtable == null) { return; } cout << vtbl: << vtable <, i, vtable[i]); func f = (func)vtable[i]; f(); //访问虚函数 } cout a::gfunction : 2 :0x4010b9->a::hvtbl:00471070function : 0 :0x4010eb->c::ffunction : 1 :0x4011d1->c::gfunction : 2 :0x401280->c::h*/
不同的推断结果调用不同的函数,这就是编译器多态。这类似于重载函数在编译器进行推导,以确定哪一个函数被调用。
3 运行期多态与编译期多态优缺点分析3.1 运行期多态优点
oo设计中重要的特性,对客观世界直觉认识。
能够处理同一个继承体系下的异质类集合。
3.2 运行期多态缺点
运行期间进行虚函数绑定,提高了程序运行开销。
庞大的类继承层次,对接口的修改易影响类继承层次。
由于虚函数在运行期在确定,所以编译器无法对虚函数进行优化。
虚表指针增大了对象体积,类也多了一张虚函数表,当然,这是理所应当值得付出的资源消耗,列为缺点有点勉强。
3.3 编译期多态优点
它带来了泛型编程的概念,使得c++拥有泛型编程与stl这样的强大武器。
在编译器完成多态,提高运行期效率。
具有很强的适配性与松耦合性,对于特殊类型可由模板偏特化、全特化来处理。
3.4 编译期多态缺点
程序可读性降低,代码调试带来困难。
无法实现模板的分离编译,当工程很大时,编译时间不可小觑。
无法处理异质对象集合。
php网站9万个主题中发现一个重要权限升级漏洞(图)php网站源码带后台
什么是seo推广?我该怎么办?
国内试用云主机哪里有?挑选要留意什么?
网站加入广告联盟后的注意事项
云存储中不可不知的五个安全问题及应对措施
为何大家都在选择百度快速排名?
【经验分享】如何才能做好网站建设
舆情信息和舆情有什么区别?