关于虚函数表的一点内容--发布日期:2007-7-26

原创 2008年10月02日 18:21:00
还是用图表和代码能说明内容:

#include <iostream>
using std::cout;
using std::endl;

class Base
{
public: //为了便于取地址
    int m_data1;
    int m_data2;
    int m_data3;
public:
    void mem_fun1();
    void mem_fun2();
    //注意虽然后面没用到这些虚函数 ,但是要使程序可以编译通过
    //需要实现他们,因为建立vtable会出错
    virtual void vir_fun1(){}
    virtual void vir_fun2(){}
};   

class Derive:public Base
{
public://为了便于取地址
    int m_data1;
    int m_data3;
    int m_data4;
public:
   void mem_fun1();
    virtual void vir_fun2(){}         
};

int main()
{
    cout<<"sizeof(Base)=> "<<sizeof(Base)<<endl;
    cout<<"sizeof(Derive)=> "<<sizeof(Derive)<<endl;
   
    Base b;
    Derive d;
    cout<<"Address of b=> "<<&b<<endl;
    cout<<"Address of b.m_data1=> "<<&(b.m_data1)<<endl;
    cout<<"Address of b.m_data2=> "<<&(b.m_data2)<<endl;
    cout<<"Address of b.m_data3=> "<<&(b.m_data3)<<endl;
   
    cout<<"Address of d=> "<<&d<<endl;
    cout<<"Address of d.m_data1=> "<<&(d.m_data1)<<endl;
    cout<<"Address of d.Base::m_data2=> "<<&(d.Base::m_data2)<<endl;
    cout<<"Address of d.Base::m_data3=> "<<&(d.Base::m_data3)<<endl;
    cout<<"Address of d.m_data3=>"<<&(d.m_data3)<<endl;
    cout<<"Address of d.m_data4=>"<<&(d.m_data4)<<endl;
   
    system("pause");
    return 0;
}       

运行结果如图:

2007072600344.gif

基类的大小为16是因为,三个int变量加上一个vptr,对应的Derive的大小就是在此基础上加三个int的大小,各数据成员的地址很清晰,也可以反映对象在内存中的存放情况。

下面两幅图是对象的内存模拟表示,看图应该就很清楚了:

20070726003415.gif

2007072600349.gif

c++ 输出虚函数表内容

class Base{ public: virtual void f(){cout
  • sxh850297968
  • sxh850297968
  • 2015年06月25日 22:15
  • 850

虚函数表(vtbl)和虚表指针(vptr)

上一篇文还留了个问题没解决呢:就是关于那个虚函数指针的问题。其实这样称呼这个指针是不正确的,他确切的应该称为“虚表指针”。不废话了直接进入正题吧。当类中有虚函数的时候,编译器会为类插入一个我们看不见的...
  • lishengwei
  • lishengwei
  • 2008年05月08日 15:42
  • 6949

虚函数表放在哪里?

引言:近日CSDN的"C/C++语言"版的一个问题引起了我的注意:"请问虚函数表放在哪里?"。我也曾经思考过这个问题,零零散散也有一定的收获,这次正好趁这个机会把我对这一部分的理解整理一下。 首先值得...
  • houdy
  • houdy
  • 2007年01月28日 14:09
  • 12637

运营一点思考

今天阅读互联网运营书籍的时候,忽然看到作者分享了一个案例,主要讲用户群的消息推送问题。作者是做课程培训的,有学员群,作者的同事在群中推送了一条消息,主要是介绍课程的信息,内容大致主要是有哪些领域中的大...
  • leanln
  • leanln
  • 2018年01月08日 23:41
  • 25

2007-7-26

今天看完了《窃明》了,很不错了一部架空小说。有时候回过头来看书中历史,真的是有很多不同的感觉。比对以前读书前读的一些历史,真是有很大差别。 历史有时候真得让人很着迷啊。...
  • krastar
  • krastar
  • 2008年07月26日 22:49
  • 120

C++虚函数表剖析

关键词:虚函数,虚表,虚表指针,动态绑定,多态一、概述为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。二、类的虚表...
  • lihao21
  • lihao21
  • 2016年02月18日 20:28
  • 8326

【C/C++语法】C++ 虚函数表解析

文章源自:http://blog.csdn.net/haoel/article/details/1948051 (陈皓专栏) 与 http://blog.csdn.net/hairetz/artic...
  • woxiaohahaa
  • woxiaohahaa
  • 2016年03月17日 15:39
  • 655

探索虚函数表的位置

引言:近日一个问题引起了我的注意:"请问虚函数表放在哪里?"。我也曾经思考过这个问题,零零散散也有一定的收获,这次正好趁这个机会把我对这一部分的理解整理一下。首先值得声明的是,本文的编译环境是VS20...
  • u014053368
  • u014053368
  • 2014年03月31日 14:08
  • 512

多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?

虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数 的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是 构造函数被调用时进行初始化的,这是实现多...
  • ysp_0607
  • ysp_0607
  • 2016年08月10日 00:43
  • 381

C++类的内存分布--虚函数表的内存分布

使用Visual Studio工具来看是类的内存分布     先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存...
  • yusiguyuan
  • yusiguyuan
  • 2014年08月22日 22:49
  • 1495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于虚函数表的一点内容--发布日期:2007-7-26
举报原因:
原因补充:

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