1.
虚拟函数表其实就是一个存放指针的指针数组,它里面有一个或者是多个指针,而每一个指针都指向一个虚函数,通过它可以知道虚函数的地址。
2.
一个类或是接口,如果声明有虚函数,那么它们就会带有
Virtual
Table
,而它们实例化的
Object
也会相应的含有一个
vptr
(一个指向
Virtual Table
的指针,位于
Object
的开始位置),用于类对象在调用类虚函数时的寻址。
3.
一个类(派生类)继承于另一个类(基类),如果基类声明有虚函数,也就是说它带有
Virtual Table
,那么派生类将继承基类的
Virtual Table
,而如果派生类改写了基类的虚函数,那么派生类的
Virtual Table
就会做相应的改变(某一个指针的值会发生变化),它将用派生类中改写了的虚函数的地址代替基类中虚函数的地址。
4.
在
C++
中可以利用
Virtual Table
,采用动态联编技术来实现多态
它与静态编译不同,一般函数和变量的地址在编译时就已经确定,采用的是静态编译,而虚拟函数因在编译时不能确定其具体地址,因而采用动态编译。
5.
实例:
Class SimpleMath
{
Public:
int add(int,int);
virtual int mul(int,int);
};
Class Math: public SimpleMath
{
Public:
int add(int,int);
int mul(int,int);
};
int SimpleMath::add(int a,int b)
{
printf(“SimpleMath::add”);
return a+b;
}
int SimpleMath::mul(int a,int b)
{
printf(“SimpleMath::mul”);
return a*b;
}
int Math::add(int a,int b)
{
printf(“Math::add”);
return a+b;
}
int Math::mul(int a,int b)
{
printf(“Math::mul”);
return a*b;
}
void main()
{
Math aMath;
SimpleMath *pSimple=&aMath;
pSimple->add(1,2); //调用的将是SimpleMath::add,
pSimple->mul(1,2); //调用的将是SimpleMath::mul,因为add是虚函数,且派生类改写了,所以调用的是派生类改写后的函数。
}