通过前两节的介绍,想必各位读者都对多态有了一定的了解。这一节将会介绍多态的实现机制。
关于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;
}
本例中定义了两个虚成员函数和一个普通成员函数,创建对象后,它们的内存布局如下所示: