__Virtual function and their implementation

原创 2007年10月01日 23:12:00
 C++ virtual function is ,
       1. a member function of a class
       2. Declare with keyword virtual
       3. Usually has different functionality in derived class
       4. A function call is revolved at run-time.
#include <iostream>
using namespace std;
class Base{
public:
    virtual _cdecl fun(int q){
       cout<<"Hello, base:"<<endl<<q<<endl;
    }
    void CallVirtualFnUsingThis()
    {
       int *p = (int*)this;
       cout<<"Address of the object:"<<hex<<*p<<endl;
       p = (int*)*p;
       cout<<"Address of VPTR:"<<hex<<*p<<endl;
       p = (int*)*p;
       cout<<"address of First function in Vitual table:"<<hex<<*p<<endl;
       void (_cdecl *pFun)(Base* const, int);
       pFun = (void(_cdecl*)(Base* const, int))p;
       (*pFun)(this, 0x25);
    }
};
int main()
{
    Base b;
    b.CallVirtualFnUsingThis();
 return 0;
}

当基类中含有虚函数时, 编译器会自动进行以下的动作:

 

1、为每一个类增加一个VTABLE VTABLE里记录了各各类里面, 所有在类或基类内声明为virtual的成员函数地址(代码所在地址)。

2、对基类和每个派生类都加入一个VPTR,并对所有这些类所定义对象内的VPTR进行初始化操作:使VPTR指向正确的VTABLE的第一个字段; VPTR是位于对象层次上的概念,当他指向了一个VTABLE时, 就知道自己是什么类型了。。

3、对每一个虚函数调用,都加入专用的虚函数代码,获取正确的函数地址。

 

the typical compiler creates a single table (called the VTABLE) for each class that contains virtual functions. The compiler places the addresses of the virtual functions for that particular class in the VTABLE. In each class with virtual functions, it secretly places a pointer, called the vpointer (abbreviated as VPTR), which points to the VTABLE for that object. When you make a virtual function call through a base-class pointer (that is, when you make a polymorphic call), the compiler quietly inserts code to fetch the VPTR and look up the function address in the VTABLE, thus calling the correct function and causing late binding to take place.

All of this – setting up the VTABLE for each class, initializing the VPTR, inserting the code for the virtual function call – happens automatically, so you don’t have to worry about it. With virtual functions, the proper function gets called for an object, even if the compiler cannot know the specific type of the object.

VR系列——Oculus最佳实践:七、虚拟幻境头晕(下)

失真校正Rift的镜头扭曲的显示屏上显示的图形,这是由SDK给出的后期处理步骤校正的。这种扭曲被正确的完成,并根据SDK的准则和所提供的实例演示是极为重要的。不正确的失真可以“看”做相当正确的,但还是...
  • huayuQA
  • huayuQA
  • 2017年03月08日 20:12
  • 392

C++ virtual函数 实现机制

C++ 虚函数表解析前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“...
  • a819825294
  • a819825294
  • 2016年07月23日 10:16
  • 1759

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

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

回调函数(callback Function)

一、概念介绍     回调函数(callback Function),顾名思义,就是为被调用方所反过来调用的函数,即调用的时机等等都完全由被调用方控制,也就是回调方法自己不使用是给别人使用的,比如说客...
  • conquer0715
  • conquer0715
  • 2013年04月06日 12:52
  • 5073

Echoprint系列--编译

最近要做一个音乐相关的客户端,其中一个功能是音乐识别,搜索了一些资料选择Echoprint来开发,Echoprint是开源免费的,而且多种客户端都支持能节约很多时间,今天主要下载和编译源码以及测试。(...
  • jwzhangjie
  • jwzhangjie
  • 2015年06月09日 13:48
  • 3259

C++——中的虚函数(Virtual function)

参考资料:http://www.programfan.com/article/2782.html 1.简介         虚函数是C++中用于实现多态(polymorphism)的机制。核心...
  • xuyuqingfeng953
  • xuyuqingfeng953
  • 2016年05月14日 10:43
  • 132

Android开发笔记(八十三)多语言支持

汉字转拼音 app中有许多场景要对汉字排序,例如通讯录姓名、商品名称、城市名称等等,这些汉字词汇通常是按照拼音排序,所以产生了把汉字转换为拼音的需求。 Android自带库 Android自带的联...
  • aqi00
  • aqi00
  • 2016年03月21日 12:57
  • 2630

c++学习笔记——虚函数(virtual function)

虚函数基础知识
  • WAN_EXE
  • WAN_EXE
  • 2017年02月20日 13:38
  • 183

C++中虚函数(virtual function)到底有多慢

本文地址:http://blog.csdn.net/hengyunabc/article/details/7461919 虚函数为什么慢,cpu分支预测技术,虚函数到底要调用哪些汇编,虚函数实现的简...
  • wyq_tc25
  • wyq_tc25
  • 2016年06月14日 21:12
  • 83

android 中gradle依赖冲突解决

android项目开发中经常会遇到库依赖异常,大多是版本依赖的冲突问题,说明下常见的版本依赖冲突解决方式首页看下我们项目的依赖关系./gradlew dependencies :app:depende...
  • u012400222
  • u012400222
  • 2017年11月29日 14:51
  • 74
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:__Virtual function and their implementation
举报原因:
原因补充:

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