在控制台下调试一下如下代码:

#include <stdio.h>

class JCDad

{

public:

JCDad(int age):m_age(age){}

virtual ~JCDad(){}

virtual void print()

{

static int count;

count++;

printf("Hey, this is dad and I'm %d.\n",m_age);

printf("\tthe count is: %d.\n",count);

}

private:

int m_age;

};

class JCSon:public JCDad

{

public:

JCSon(int age):JCDad(55),m_age(age){}

virtual ~JCSon(){}

virtual void print()

{

printf("Hey, this is son and I'm %d.\n",m_age);

printf("my dad said: ");

JCDad::print();

}

private:

int m_age;

};

int main()

{

JCDad dad(50),*pdad;

JCSon son(21),*pson;

dad.print();

son.print();

son.JCDad::print();

pdad=&son;

//      pson=&dad;                                                    //error:cannot convert from JCDad* to JCSon*, requires reinterpret_cast

pdad->print();

//      pdad->JCSon.print();                           //error:JCSon is't a member of JCDad

//      pson->print();

return 0;

}

===============================================================================

运行结构如下:

如下给出两个对象的变量窗口:

如下给出给个成员的存储空间:

&dad=0x0012ff6c-------------------------------|

&dad.m_age=0x0012ff70                             |---------sizeof(dad)=8

&dad+1=0x0012ff74---------------------------|

&son=0x0012ff5c

&son.JCDad::m_age=0x0012ff60--------------|

&son.m_age=0x0012ff64                             |---------sizeof(son)=12

&son+1=0x0012ff68---------------------------|

如下给出了指针赋值后的变量窗口:

总结:

1. 从count变量的输出可以看出两个对象共享函数JCDad::print(),而从成员变量的地址空间可以看出两个对象拥有独立的地址空间而且空间大小不一定就是成员变量的空间大小之和,可能是考虑到数据对齐的缘故吧。其实这是必然的,从函数的调用就可以发现。

书中的原话是“同一个类的所有对象共享同一个成员函数的地址空间,而每个对象有独立的成员变量地址空间。也可以这样说成员函数式类拥有的,成员变量是类的对象拥有的”

2. 从对象的变量窗口中可以看出两个对象具有独立的虚函数表入口,在调用虚函数的时候就是通过这个表索引得到的

3. 经调试事实上virtual只需要在父类中申明就可以了,而且该virtual可以一直继承下去。但是考虑到代码的维护的问题因此可以在每个继承关系链上都添加virtual作为申明。

4. 注意到虚函数表指向的是指针值的最近继承链类对象的函数

下面给出了实例的内存图:

转载于:https://www.cnblogs.com/dashingman/archive/2012/06/28/2568833.html

看看虚函数表是什么样的相关推荐

  1. C++对象的内存布局1---基础篇----C++ 虚函数表解析

    [-] 前言 虚函数表 一般继承(无虚函数覆盖) 一般继承(有虚函数覆盖) 多重继承(无虚函数覆盖) 多重继承(有虚函数覆盖) 安全性 结束语 附录一:VC中查看虚函数表 附录 二:例程 前言 C++ ...

  2. C++中的虚函数表介绍

            在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时会执行动态绑定.因为我们直到运行时才能知道到底调用了哪个版本的虚函数,所以所有虚函数都必须有定义.通常情况下,如果我们不使 ...

  3. 虚函数表剖析,网上转的,呵呵

    http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html C++虚函数表解析(转) C++中的虚函数的作用主要是实现了多态的机制.关于多 ...

  4. C++ 虚函数表解析

    转载自 https://blog.csdn.net/zhou191954/article/details/44919479 C++ 虚函数表解析 前言 C++中的虚函数的作用主要是实现了多态的机制.关 ...

  5. C++对象内存布局--①测试虚函数表属于类

    C++对象内存布局--①测试虚函数表属于类 测试1:同一个类的多个对象共享同一张虚函数表.   //虚函数表.cpp //2010年8月18日 //测试虚函数表,说明虚函数表属于类所有.同一个类的多个 ...

  6. C++迟后联编和虚函数表

    先看一个题目: class Base { public:virtual void Show(int x){cout << "In Base class, int x = &quo ...

  7. 虚函数表 vtable

    如果一个类包含了虚函数,那么在创建对象时会额外增加一张表,表中的每一项都是虚函数的入口地址.这张表就是虚函数表,也称为 vtable. 可以认为虚函数表是一个数组. 为了把对象和虚函数表关联起来,编译 ...

  8. 图解C++虚函数 虚函数表

    图解C++虚函数 2016年07月02日 17:47:17 海枫 阅读数:5181 标签: 虚函数c++g++对象模型C++虚函数更多 个人分类: C/C++/linux 版权声明:本文为博主原创文章 ...

  9. C/C++杂记:虚函数的实现的基本原理 虚函数表

    Malecrab 博客园 首页 新随笔 联系 订阅 管理 C/C++杂记:虚函数的实现的基本原理 1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函 ...

  10. C++虚函数表,虚表指针,内存分布

    虚函数表和内存分布那一块转载自:https://blog.twofei.com/496/ 虚函数效率转载自:https://www.cnblogs.com/rollenholt/articles/20 ...

最新文章

  1. cdh的hive配置文件位置_CDH6配置 Atlas,及 Hive Hook
  2. Map 3D 2013中的AcMapMap.GroupModified 和AcMapMap.LayerModified 事件的参数变化
  3. 成功解决pandas\core\generic.py:3660: SettingWithCopyWarning:  A value is trying to be set on a copy of a
  4. 树莓派python_树莓派中如何创建python文件
  5. linux domino启动和停止命令,在unix平台中通过脚本来启动和停止domino和domino控制器所用的参数_lotus notes...
  6. 双11过后张勇感谢快递小哥:再大的纪录都是靠大协作来完成的
  7. 23种设计模式(十)对象创建之构建器
  8. Thread中yield方法
  9. STORM之ITridentSpout、FirstN(取Top N)实现、流合并和join
  10. 钉钉手机版免密自动登陆SuiteCRM
  11. SQLite3:对SQLite3加密
  12. SAE 搭建微信公众平台
  13. 《变量——本土时代的生存策略》(2021-2049)何帆/著 读后感
  14. 按摩店用的收银系统多少钱一套
  15. [转帖]ABAQUS学习和开发浅谈 [原创]
  16. 下拉推荐在 Shopee Chatbot 中的探索和实践
  17. Centos7 连接wifi (PEAP)
  18. ubuntu18给当前用户安装cuda11.2 图文教程 、 配置cuDNN8.1 ——【一文读懂】
  19. Flutter环境配置基本语法如何使用库
  20. 什么是 MIME ?

热门文章

  1. 设计模式09_代理模式
  2. docker內安装TOPT
  3. 添加列oracle默认值,Oracle 11g增加列,并带默认值的新特性
  4. 985毕业,3年大数据经验,面试阿里腾讯失败,只因做不好报表
  5. dajngo3,vue3前端项目搭建,vue项目结构的介绍
  6. php 抽象类 接口 区别,PHP中抽象类和接口有什么区别
  7. 满屋花网页代码_成为更好的程序猿!2020年给网页开发人员的32条建议
  8. 我的世界服务器开启就停止运行,我的世界怎么停止时间
  9. 计算机算法设计与分析 找零钱问题
  10. 【TensorFlow-windows】(六) CNN之Alex-net的测试