c++中虛表函数

#include <iostream>
using namespace std;

class Grail
{
	public:
	virtual void _A()
	{
		cout<<"Grail::_A()"<<endl;
	}
	virtual void _B()
	{
		cout<<"Grail::_B()"<<endl;
	}
	virtual void _C()
	{
		cout<<"Grail::_C()"<<endl;
	}
};
int main()
{
	typedef void (*pFun)();//函数指针。
	Grail g;
	for(int i=0;i<3;i++)
	{
	pFun pfun = (pFun)*((int *)(*(int *)(&g))+i);
	pfun();//取得虛表对应的函数。
	}
}

心得:C++ Class 的完整virtual  function 在编译时期就固定下来了,程序没有办法在执行期间动态的增加或者取代其中莫一个。所以虚拟调用操作得以有做快的派送结果,付出的成本则是执行期的弹性。

时间: 2024-10-12 11:30:30

c++中虛表函数的相关文章

SQLserver 2008同步复制创建后新增表/函数/存储过程(不重新初始化快照)

SQLserver 2008同步复制创建后新增表/函数/存储过程(不重新初始化快照) 一.在生产环境中已有事务复制中(复制类型为事务发布),需要对已有发布的数据库新增表.视图.存储过程等,这些变更是不会同步到从库中.如必须应用到从库,有以下两种方法: 1.如果采用默认的设置,每次都需要重新初始化快照,从库重新应用快照和未执行的同步命令,这在生产环境中对数据库压力或性能或DBA可维护性表现的很差. 2.将新增的架构变更新建一个新的发布订阅,但会造成维护困难,增加出错的几率. 3.可以通过设置imm

JQuery中内容操作函数、validation表单校验

JQuery:内容体拼接(可以直接拼接元素节点和内容节点) JQuery实现: 方案1:A.append(B); == B.appendTo(A);A的后面拼接B 方案2: A.prepend(B); == B.prependTo(A);A文本的最前面插入B text()与html()比较: 1.相同点: 都可以设置或获取内容 2.不同点: 获取时,html()获取的是所有内容体:标签+文本 text()获取的只是文本 设置时,如果设置的内容有html()标签 html()设置的内容可以被浏览器

查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数

查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅 (1)查询SQLServer2005中某个数据库中的表结构 SELECT TOP 100 PERCENT --a.id,CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,CASE WHEN a.colorder = 1 THEN isnull(f.v

Sqlserver 中系统表sysobjects、syscolumns以及函数object_id

1.sysobjects 系统对象表. 保存当前数据库的对象,如约束.默认值.日志.规则.存储过程等 sysobjects 重要字段解释: sysObjects ( Name sysname, --object 名称 id int, --object id xtype char(2), -- object 类型 type char(2), -- Object 类型(与xtype 似乎一模一样) uid smallint, -- object 所有者的ID ... --其他的字段不常用到. ) ?

浅析在类模版中构建成员函数时,使用memcpy产生的副作用

一般情况下我们在对类模版中的成员函数进行构建时会经常对一些数据进行复制拷贝,而通常情况下我们都不提倡用memcpy进行拷贝,因为在类模版中所传进来的类型可以是内置类型也可以是非内置类型,除非你在成员函数中使用memcpy前进行类型萃取,否则它所带来的副作用的后果也是很可怕的.memcpy在对内置类型可正常拷贝,而在对非内置类型拷贝时会出现浅拷贝的现象. 下面我们可以通过一个简单的顺序表程序来分析memcpy对非内置类型所产生的副作用: #include<iostream> #include&l

Lua中的常用函数库汇总

lua库函数 这些函数都是Lua编程语言的一部分, 点击这里了解更多. assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 collectgarbage() - 垃圾收集器. (新增于1.10.1) date(format, time) - 返回当前用户机器上的时间. error("error message",level) - 发生错误时,输出一条定义的错误信息.使用pcall() (见下面)捕捉错误

【最后的冲刺】android中excel表的导入和数据处理

[最后的冲刺]android中excel表的导入和数据处理 --学校课程的查询和修改 1.编写 The Class类把课程表courses.db当做一个实体类,hashcode和equals这两个类是为了判断输入的查询内容和Excel表中的内容是否一致. 并在java里面区别两个对象是否一致 1 public class TheClass { 2 private String classname; 3 private String type; 4 private String teacher;

sqlserver中的存储过程 函数 事物 索引及视图

                                       存储过程和函数具体的区别: 核心提示:本质上没区别.只是函数有限制只能返回一个标量,而存储过程可以返回多个.并且函数是可以嵌入在SQL中使用的,可以在SELECT等SQL语句中调用,而存储过程不行.执行的本质都一样. 函数限制比较多,如不能用临时表,只能用表变量等,而存储过程的限制相对就比较少. 1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强. 2. 对于存储过程来说可以返回参数,而函数只

Oracle中dual表的用途介绍

导读]dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情.     dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 select user from dual; 2.用来调用系统函数 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') f