C++ 作为面向动态语言,有三大特性:封装、继承、多态。其中多态特性的实现就是基于C++中的虚函数实现的。每一个带有虚函数的类都会有一个虚函数表,那么到底虚函数表中存的什么函数呢?
先看一段代码示例:
#includeclass BaseClass{ public: virtual void fun1(){ printf("BaseClass::fun1n"); } virtual void fun2(){ printf("BaseClass::fun2n"); } void funCommon(){ printf("BaseClass::funCommonn"); } }; class SubA :public BaseClass{ public: virtual void fun2(){ printf("SubA::fun2n"); } }; class SubB:public SubA{ public: virtual void fun1(){ printf("SubB::fun1n"); } }; int main(){ BaseClass* obj1 = new BaseClass; obj1->fun1(); obj1->fun2(); BaseClass* obj2 = new SubA; obj2->fun1(); obj2->fun2(); BaseClass* obj3 = new SubB; obj3->fun1(); obj3->fun2(); obj3->funCommon(); return 0; }
运行以后查看obj3监视:
在监视中可以看到obj3下面有一个_vfptr数组,数组里面有两个变量:函数的指针,分别是:
[0] 0x0034111d SubB::fun1(void)
[1] 0x00341014 SubA::fun2(void)
对象obj3调用函数fun1的时候会调用 SubB::fun1;
对象obj3调用函数fun2的时候会调用 SubA::fun2;
这是因为class SubB继承自class SubA,同时又重写了fun1,当有class SubB生成的对象obj3调用fun1函数时,通过虚函数表查到应该调用SubB::fun1,当调用fun2函数时,通过虚函数表查到应该调用SubA::fun2.所有就完成了一次动态调用。
同类可以查看obj2对象的虚函数表:
原理是一样的。
虚表是属于类的,而不是属于具体的对象,一个类只有一个虚表】。同一个类的所有对象都使用这个虚表。一个继承类的基类如果包含虚函数,那个这个继承类也有拥有自己的虚表,所以继承类的对象也包含一个虚表指针,用来指向它的虚表
aaa



