本文研究单继承情况下,c++对象的虚函数表的具体情况。

假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2。

测试的代码如下:

#include<iostream>
using namespace std;
class A
{
public:
virtual void fun1()
{
cout<<"A::fun1"<<endl;
} }; class B:public A
{
public:
virtual void fun2()
{
cout<<"B::fun2"<<endl;
} virtual void fun1()
{
cout<<"B::fun1"<<endl;
} }; typedef void (*Fun)(void);
int main(int argc, char* argv[])
{
B b; cout<<"虚函数表指针的地址为:"<<(int *)(&b)<<endl;
cout<<"虚函数表的地址为:"<<*(int *)(&b)<<endl;
cout<<"第一个虚函数fun1的地址为:"<<(int *) *(int *)(&b)<<endl; Fun fun1=( Fun) ( *(int *) *(int *)(&b));
fun1(); cout<<"第二个虚函数fun2的地址为:"<< (int *) ((int *) (*(int *)(&b))+1) << endl;
Fun fun2=(Fun) (* ((int *) (*(int *)(&b))+1));
fun2();
return 0;
}

运行结果:

虚函数表指针的地址为:0xbfa9a77c
虚函数表的地址为:134515592
第一个虚函数fun1的地址为:0x8048b88
B::fun1
第二个虚函数fun2的地址为:0x8048b8c
B::fun2

测试代码说明:

虚函数表指针             (int *)(&b)

虚函数表地址           *(int *)(&b)

虚函数表的第一个元素,也就是指向fun1的指针  (int * )(*(int *)(&b))

虚函数表的第二个元素,也就是指向fun2的指针  (int * )(*(int *)(&b)) + 1)

在这种单继承的情况下,如果有虚函数表,那么只有一个虚函数表,并且按照虚函数声明的顺序顺序排列,派生类的虚函数紧接着基类的虚函数排列,类B的虚函数表结果如下图所示:

C++ 虚函数表 单继承的更多相关文章

  1. C++ 虚函数表解析 继承

    C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父 ...

  2. C++单继承、多继承情况下的虚函数表分析

    C++的三大特性之一的多态是基于虚函数实现的,而大部分编译器是采用虚函数表来实现虚函数,虚函数表(VTAB)存在于可执行文件的只读数据段中,指向VTAB的虚表指针(VPTR)是包含在类的每一个实例当中 ...

  3. C++多态中虚函数表合并与继承问题

    多态: C++的多态是通过一张虚函数表(Virtual Table)来实现的,简称为 V-Table.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆写的问题,保证其真实反应实际的函数. ...

  4. c++ 继承类强制转换时的虚函数表工作原理

    本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...

  5. 详谈C++虚函数表那回事(一般继承关系)

    沿途总是会出现关于C++虚函数表的问题,今天做一总结: 1.什么是虚函数表: 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table. ...

  6. C++ 由虚基类 虚继承 虚函数 到 虚函数表

    //虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!&q ...

  7. C++ 虚函数表与多态 —— 继承的虚函数表 & 内存布局

    1. 使用继承的虚函数表: 如果不涉及多重继承,每个类只有1个虚函数表,当子类继承父类后,子类可以自己改写和新增虚函数,如下图所示: 子类重写 func_1 后,子函数的 func_1 将会有新的逻辑 ...

  8. C++虚函数表

    大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...

  9. 深入理解C++虚函数表

    虚函数表是C++类中存放虚函数的一张表,理解虚函数表对于理解多态很重要. 本次使用的编译器是VS2013,为了简化操作,不用去操作函数指针,我使用到了VS的CL编译选项来查看类的内存布局. CL使用方 ...

随机推荐

  1. xcode7,AFN不能使用的问题

    今天手贱立刻升级了Xcode7,结果AFN报错,且不能用了,解决办法如下 第一步:升级AFN到2.6.0 完成之后,运行,结果请求都失败,提示 The resource could not be lo ...

  2. [HNOI2011]任务调度

    题目描述 有 N 个任务和两台机器 A 与 B.每个任务都需要既在机器 A 上执行,又在机器 B 上执行, 第 i 个任务需要在机器 A 上执行时间 Ai,且需要在机器 B 上执行时间 Bi.最终的目 ...

  3. POJ 2289(多重匹配+二分)

    POJ 2289(多重匹配+二分) 把n个人,分到m个组中.题目给出每一个人可以被分到的那些组.要求分配完毕后,最大的那一个组的人数最小. 用二分查找来枚举. #include<iostream ...

  4. hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. hdu 3308 最长连续上升区间

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. [济南集训 2017] 求gcd之和

    题目大意: 求\(\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\) 解题报告: 有一个结论:一个数的所有因子的欧拉函数之和等于这个数本身 运用这个我们可以开始推: \(\sum_{ ...

  7. 简单的国际化i18n

    就是简单的中英文转换 index.jsp <%@ page language="java" contentType="text/html; charset=UTF- ...

  8. public、protected、default、private区别

    public.protected.default.private: 修饰符 本类 同包 子类 其他 public √ √ √ √ protected √ √ √ × default √ √ × × p ...

  9. Python中的转义

    在Python交互式解释器中,输出的字符串会用引号引起来,特殊字符会用反斜杠(\)转义.如果遇到带有\的字符被当作特殊字符时,有以下两种处理方法:1.使用双反斜杠(\\)来转义2.使用原始字符串,方法 ...

  10. python学习之路web框架

    WEB框架的本质 python的WEB框架分为两大类: 1.自己写socket,自己处理请求 2.基于wsgi(Web Server Gateway Interface WEB服务网关接口),自己处理 ...