关闭

虚拟函数表(Virtual Table)

标签: tablemathobjectclassc++
625人阅读 评论(0) 收藏 举报
分类:
 
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是虚函数,且派生类改写了,所以调用的是派生类改写后的函数。
}
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:106567次
    • 积分:1590
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:18篇
    • 译文:0篇
    • 评论:16条
    最新评论