虚拟函数表(Virtual Table)

原创 2007年09月26日 11:48:00
 
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是虚函数,且派生类改写了,所以调用的是派生类改写后的函数。
}
 

子类虚函数表(包括虚函数+函数)

对于多重继承,如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表。如下继承关系(没有覆盖): 在子类Derive实例中的虚函数表: 子类自己定义的虚函数会被放到了第一个基类的虚函数表中。 ...
  • fdsafwagdagadg6576
  • fdsafwagdagadg6576
  • 2016年06月16日 15:29
  • 298

详解虚函数表virtual table

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术...
  • wwwwxhh
  • wwwwxhh
  • 2016年03月28日 10:42
  • 233

学习整理——C++ virtual虚函数与多态

多态与动态绑定 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将...
  • Jeffery_Gong
  • Jeffery_Gong
  • 2016年10月07日 17:54
  • 855

Java语言到底有没有虚函数?

前几天面试京东的时候,被问到c++与java函数的区别。其中有一条是,java中有没有虚函数?本文将从虚函数的定义及java字节码层面上告诉你答案。 定义:在某基类中声明为 virtual 并在一...
  • wuqiuping695
  • wuqiuping695
  • 2015年10月12日 11:21
  • 4955

C++ virtual函数 实现机制

不知道关键词用的对不对(什么smartPtr之类的,也不是本来意思,就是随便起个名字),就是看看virtual这个属性是怎么向下(子孙)继承的,又能不能取消掉 测试代码如下: #include u...
  • huqinweI987
  • huqinweI987
  • 2016年02月17日 22:11
  • 2678

方法的虚分派(virtual dispatch)和方法表(method table)

Java方法调用的虚分派 JUN 2ND, 2013 | COMMENTS 本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解。需要预先理解 Java 字节码...
  • novelly
  • novelly
  • 2014年02月23日 21:12
  • 501

【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)

c++单继承、多继承、菱形继承内存布局(虚函数表结构)
  • SuLiJuan66
  • SuLiJuan66
  • 2015年10月04日 18:44
  • 2814

虚函数表存放在哪里

1.虚函数表是全局共享的元素,即全局仅有一个. 2.虚函数表类似一个数组,类对象中存储vptr指针,指向虚函数表.即虚函数表不是函数,不是程序代码,不肯能存储在代码段. 3.虚函数表存储虚函数的地...
  • jiary5201314
  • jiary5201314
  • 2016年09月22日 21:02
  • 3300

虚函数表存在的位置,初始化时机

转zhttp://blog.csdn.net/lingfengtengfei/article/details/12345809 1.虚函数 ·虚表是怎么实现的?虚表存放在哪里? ...
  • guogaoan
  • guogaoan
  • 2014年09月22日 15:05
  • 1420

VS2010命令行下查看虚函数表和类内存布局

VS2010命令行下查看虚函数表和类内存布局 ——《深度探索C++对象模型》读书札记系列   在学习多重继承下的Virtual functions时,需要分析派生类的虚函数表(vtable),但...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年03月07日 10:55
  • 994
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:虚拟函数表(Virtual Table)
举报原因:
原因补充:

(最多只允许输入30个字)