C++虚函数表vtable
通过前两节的介绍,想必各位读者都对多态有了一定的了解。这一节将会介绍多态的实现机制。
关于C++内部如何实现多态,对程序员来说即使不知道也完全没关系,但是如果你想加深对多态的理解,写出优秀的代码,那么这一节就具有重要的意义。
C++通过虚函数表(一般用 vtable 表示)来实现多态。
对于有虚函数的类,创建对象时会额外创建一个数组,数组中的每个元素都表示一个虚函数的地址。这个数组就是虚函数表。然后,将虚函数表的地址插入到对象的最前面。
请看下面的例子:
关于C++内部如何实现多态,对程序员来说即使不知道也完全没关系,但是如果你想加深对多态的理解,写出优秀的代码,那么这一节就具有重要的意义。
C++通过虚函数表(一般用 vtable 表示)来实现多态。
对于有虚函数的类,创建对象时会额外创建一个数组,数组中的每个元素都表示一个虚函数的地址。这个数组就是虚函数表。然后,将虚函数表的地址插入到对象的最前面。
请看下面的例子:
#include <iostream> using namespace std; class Base{ protected: int a; int b; public: virtual void func1(){ cout<<"Base::func1"<<endl; } virtual void func2(){ cout<<"Base::func2"<<endl; } void func3(){ cout<<"Base::func3"<<endl; } }; int main(){ Base *p = new Base; p -> func1(); p -> func2(); p -> func3(); return 0; }本例中定义了两个虚成员函数和一个普通成员函数,创建对象后,它们的内存布局如下所示: