虚拟函数表(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是虚函数,且派生类改写了,所以调用的是派生类改写后的函数。
}
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

详解虚函数表virtual table

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

4.2 Virtual Member Functions(虚拟成员函数)

一、两个基本概念我们已经讨论过virtual function的一般实现模型:每个class 有一个virtual table,内含该class中有作用的virtual function的地址,然后每...
  • iFuMI
  • iFuMI
  • 2016-10-08 15:48
  • 209

C++ 实用泛型编程之 虚拟函数(C++ virtual function)杂谈

一 C++虚拟函数(C++ virtual function)杂谈   我们在编程的时候,经常会遇到这样的情况,假设有两个对象,你要在函数中分别调用它们的OnDraw方法,我们以前的做法一般是这样的。...

【C++】深度探索C++对象模型之虚拟成员函数(virtual member function)

virtual member function的实现机制

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

Java方法调用的虚分派 JUN 2ND, 2013 | COMMENTS 本文通过介绍 Java 方法调用的虚分派,来加深对 Java 多态实现的理解。需要预先理解 Java 字节码和 JVM...

虚表(C++)virtual table

虚表(C++)virtual table Posted on 2009-11-20 01:27 lihaosky 阅读(508) 评论(0)  编辑 收藏 C++ 中的虚函数的作用主要是实现了多态的...

C#中修饰符用法“virtual(虚拟函数)、override(函数复写)、static(静态函数)、abstract(抽象函数)、sealed(密封函数)”

1、virtual用于修饰方法、属性、索引器或者事件声明,并使它们可以在派生类中被重写。virtual不能与static、abstract、private或者override修饰符一起使用。 声...

Postfix有关Virtual、Aliases、虚拟表等概念之间的关系

Postfix有关Virtual、Aliases、虚拟表等概念之间的关系 作者:serial0 2005-02-01 11:30:57 来自:linuxforum.net使用Postfix的别名、虚拟...
  • mal327
  • mal327
  • 2011-07-03 10:22
  • 1689

The virtual table

To implement virtual functions, C++ uses a special form of late binding known as the virtual table. ...

详解virtual table(转)

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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