C++再次理解虚表


#include <iostream>
using namespace std;

class Base
{
public:
    virtual void fun1()
    {
        cout << "Base::fun1()" << endl;
    }
    virtual void fun2()
    {
        cout << "Base::fun2()" << endl;
    }
};
class Son : public Base
{
public:
    void fun1()
    {
        cout << "Son::fun1()" << endl;
    }
};
void Deal(int *p)
{
    typedef void(*Pfun)();//函数指针。
    //再次记住每张虚表后面的结束符是0(NULL)。
    for (int i = 0; p[i] != NULL; i++)
    {
        Pfun fun = (Pfun)p[i];
        fun();
    }
}
void test()
{
    Base b;
    Son s;
    int *p = (int *)*((int *)(&b));//此处是虚表的地址。
    Deal(p);//将虚表地址传入。
}
int main()
{
    test();
    return 0;
}

时间: 2024-12-23 14:57:38

C++再次理解虚表的相关文章

再次理解WCF以及其通信(附加一個編程小經驗)

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中. WCF

(转)java.ByteArrayInputStream与ByteArrayOutputStream再次理解

转载自:java.ByteArrayInputStream与ByteArrayOutputStream再次理解 第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下. ByteArrayOutputStream的用法 以下是JDK中的记载: public class ByteArrayOutputStream  extends OutputStream 此类实现了一个输出流,其中

再次理解HTTP请求过程

我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次!程序只管处理一次即可! HTTP请求 步骤1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据: 路径:/html/path: 域名:由Host头指定:Host: www.sina.com.cn 以及其他相关的Header: 如果是

ON_MESSAGE和ON_NOTITY再次理解

ON_NOTIFY是控件向其父窗口发送消息处理的宏,ON_COMMAND是菜单和工具栏项处理消息的宏,ON_MESSAGE是处理自定义消息的宏 对这几个消息的理解要先了解一下Window消息的背景. 在Windows3.1里,控件会将mouse, keybord等等的消息通知它的父窗口, 使用的消息就只有WM_COMMAND, 事件种类和控件ID被包含在wParam中, 控件的句柄包含在lParam中.由于wParam和 lParam已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时

二分算法 再次理解

二分算法 再次理解 详解二分查找算法 这篇博客很详细介绍了二分算法的一些细节问题 寻找一个数,也是最基本的二分搜索 //代码示例如下 int bsearch(int []nums, int target) { int left=0, right=nums.length-1;//这里的数组长度用法可以是其他的形式 while(left<=right) { int mid = left + (right - left) / 2; if(num[mid] == target) return mid;

再次理解javascript的apply

普通函数执行的时候,this指向函数执行的上下文 其实就是一个原型链的结构... 我一直没有搞懂原型链莫非它们像链条一样连在一起? 昂... 原型链可以理解成继承吗? 就像,java里边的继承吧嗯嗯刚想说这个 写js的时候一般没用到这里,还有apply()和call()一直搞不清太灵活了,不知道是什么,想要干啥 ES6新的语法来讲,你可能会看着比较熟悉了 call 和 apply就是绑定一个函数执行的 this指向 觉apply()和代码上下文有很大关系 这意思是修改父类吗? 不是.. 那我又不

再次理解js中的call函数

a.call(b); 网上说明的版本比较多.有的说,是指针替换.有说,将a对象的方法加在b对象执行.官方说:什么对象替换什么对象.反正看了几个版本,尽管有具体的实例,看了我三次都没看懂它的具体含义.看过还是云里雾里的.后来发现,结合实验去理解非常好. 其实,换成自己能够接受的方式理解为好.a对象的方法应用到b对象上(函数apply的意思正好说明符合这样理解:a对象应用到b对象上去) a对象既然添加到b对象上了.那么b对象自然就拥有了a对象所有的内容.所有,b对象就继承了a对象了.结合自己编写的下

如何理解虚表及其计算含虚函数的类的大小

在什么情况下系统会自动生成缺省(默认)的构造函数? 1.在类里面有一个类类型的对象,这个类有自己的缺省构造函数(有缺省的参数,参数有缺省值). class B { B(int data) {  } };不能合成 class B { B(int data=0) {  } };会合成 class B { public: B(int data=0) {  } }; class C:public B { public: C() :B(0) {  } B b;  //编译器会自动合成 }; 2.类是虚拟继

对static的再次理解

随着做技术工作的不断深入,能在常见的语法和对象使用中获取更深的理解,我想,这大概就是孔老夫子说的"温故而知新"吧. 言归正传,java中的static大概分4中用法吧(漏掉的请大神在评论补充). 修饰成员变量和成员方法.这应该是对static的最初印象. 修饰代码块.这大概是在开始做项目的时候就会遇到.栗子就不举了. 修饰内部类. 静态导入.import static静态导入是JDK1.5中的新特性.虽然使用的比较少,但是知不知道应该可以作为检验真爱粉的一项标准吧 . 能使用第一点是作