虚拟函数表(Virtual Table)
来源:互联网 发布:网络骑士怎么不写了 编辑:程序博客网 时间:2024/04/30 10:09
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)
- virtual-key code 虚拟键值表 虚拟键TABLE VK TABLE (转载的转载。)
- c++虚拟函数virtual
- 详解虚函数表virtual table
- private virtual 私有虚拟函数
- Virtual(虚拟)
- 4.2 Virtual Member Functions(虚拟成员函数)
- 虚拟互换(virtual swap)
- 虚表(C++)virtual table
- 详解virtual table(转)
- 虚表(C++)virtual table
- 虚表(C++)virtual table
- 考虑可选的 virtual functions(虚拟函数)的替代方法
- C++ 实用泛型编程之 虚拟函数(C++ virtual function)杂谈
- 虚拟键值表, virtual key code
- 虚拟列表(virtual list control)
- Windows虚拟码(Virtual-Key Codes)
- 【虚拟思维】什么是虚拟机(virtual machine)
- ..net mobile
- 一年只买卖一支股票就够了
- 用C#实现一种超酷的任务栏滑出式提醒框
- 怎样用PL/SQL表实现数组功能
- 动态构造 Java 类的一种方法: ClassLoader 的设计 (4)
- 虚拟函数表(Virtual Table)
- Continuous Integration is your best friend
- 虚荣
- 中秋节
- WinXP+Mac OS X+Linux的多操作系统安装
- csdn报道
- [MSDN]C# 3.0 锐利体验系列课程 之四 查询表达式LINQ (2)
- 关于查询结果的显示问题
- 面向对象、基于对象和面向过程