虚函数表

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是虚函数,且派生类改写了,所以调用的是派生类改写后的函数。
}

你可能感兴趣的:(Math,c,object,table,Class)