普通成员函数跟着类 ,虚函数跟着对象

①作为普通成员函数

class A{public:void print(){cout << " class A " << endl;}
};class B : public A{public:void print(){cout << " class B " << endl;}
};
// gnu对象模型
int main(){cout << "The size of A is " << sizeof(A) << endl;cout << "The size of B is " << sizeof(B) << endl;B b;A &a = b;  // 利用A类的引用指向B类的对象A *c = &b; // 利用A类的指针指向B类的对象b.print();a.print();  // A类的引用调用print()c->print(); // A类的指针调用 print()// 普通函数跟着类// 虚函数跟着对象return 0;
}

因为A和B类中不存在任何成员属性,对象不需要任何存储成员属性的空间,但一个对象至少占有一个字节,系统自动为其分配了一个字节。

②变为虚函数后:

class A{public:virtual void print(){cout << " class A " << endl;}
};class B : public A{public:void print() override{     // override 可不写,此处是为了编码规范cout << " class B " << endl;}
};
// gnu对象模型
int main(){cout << "The size of A is " << sizeof(A) << endl;cout << "The size of B is " << sizeof(B) << endl;B b;A &a = b;  // 利用A类的引用指向B类的对象A *c = &b; // 利用A类的指针指向B类的对象b.print();a.print();  // A类的引用调用print()c->print(); // A类的指针调用 print()return 0;
}

A和B类的大小和64位指针的大小是一样的,因为A和B对象的前8个字节存放着虚表地址,该地址指向虚函数表 vtable。

③打印出虚表的内容

使用函数指针来打印虚表,this 指针:特殊的变量

// 定义函数指针
// typedef void(*fun_t)(int);
typedef void(*fun_t)(void *,int);//基类
class Base{
public:virtual void f(int x){cout << this << endl;cout << "Base::f "<< x << endl; }virtual void g(int x){cout << this << endl;cout << "Base::g " << x << endl; }virtual void h(int x){cout << this << endl;cout << "Base::h " << x << endl;}};//子类 公有继承基类
class Derive: public Base{
public:void g(int x) override {cout << this << endl; cout << "Derive::g " << x << endl;}
};int main(void)
{cout << "sizeof(Base): " << sizeof(Base) << endl;Base b;Derive d;Base &c = d;Base *pBase = new Derive;//方法一:((fun_t**)(&b))[0][1](&c,7);((fun_t**)(&b))[1][1](&c,9);//方法二:// long *pvptr = (long*)(&b);long *pvptr = (long *)pBase;long *vptr = (long *)*pvptr;fun_t f1 = (fun_t)vptr[0];fun_t f2 = (fun_t)vptr[1];fun_t f3 = (fun_t)vptr[2];f1(&b,1);f2(&b,2);f3(&b,3);return 0;
}

其他参考:

【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局 - 赵子清 - 博客园

图说C++对象模型:对象内存布局详解 - melonstreet - 博客园

https://coolshell.cn/articles/12176.html

【C++】 C++虚函数表详细分析(上)

今朝醉:C++幕后故事(四)-- 虚函数的魅力

人类身份验证 - SegmentFault

守望:GDB调试入门指南

c++虚函数_「C++」对象模型和虚函数相关推荐

  1. python数学函数_「分享」关于Python整理的常用数学函数整理

    原标题:「分享」关于Python整理的常用数学函数整理 1.函数说明 abs(number)返回数字的绝对值,如abs(-10)返回10 pow(x,y[,z]) 返回x的y次幂(所得结果对z取模), ...

  2. decode函数_「实践」云函数 + API,你也可以做个天气信息系统

    为什么要把云函数 SCF 与 API 网关进行结合?本文告诉你答案! 通常,我们用云函数 SCF 写一个函数应用,这个应用可能多种多样.例如之前介绍过的 OJ 系统判题功能,通过 NLP 实现文本摘要 ...

  3. 6-7 使用函数输出水仙花数_「Java」再议printf函数

    System.out.printf() 是在JDK1.5版开始引入的方法,即在JDK1.5以后的版本才可以使用此函数,printf 方法有 printf(String format, Object . ...

  4. mysql时间戳diff函数_「timestampdiff」MySQL函数---TIMESTAMPDIFF - seo实验室

    timestampdiff TIMESTAMPDIFF(Interval,datetime_expr1,datetime_expr2) 返回日期或日期时间表达式datetime_expr2- date ...

  5. matlab软件imag函数_「复变函数与积分变换」基本计算代码

    使用了Matlab代码,化简平时遇到的计算问题,也可以用于验算结果 来自211工科专业2学分复变函数与积分变换课程 求复角主值 sym(angle(待求复数))%公式 sym(angle(1+sqrt ...

  6. c++ max函数_「C/C++」函数:定义、调用、参数传递

    5.1基本概念 函数分为主函数和子函数,一个程序中主函数有且只有一个,是程序的入口,而函数(或称子函数)可以有很多.子函数的存在可以让主函数不臃肿.一目了然,增强代码可读性. 引入函数的意义:利用率高 ...

  7. tomcat 不支持put 高版本_「MG6_DCT280」湿式七档双离合版本-性价比并不高

    上汽名爵_MG6定义为「掀背式运动轿车」,设计感很有些英伦风格,性能也确实可圈可点.然而这台车只有MT版本值得选择,即使在新款升级"DCT280"湿式七档双离合变速箱后也不例外.因 ...

  8. 用typescript完成倒计时_「干货」将数十万行CoffeeScript代码迁移到TypeScript

    作者 | David Goldstein 译者 | 王强 策划 | 小智 转发链接:https://mp.weixin.qq.com/s/TK7kWXX4hR3e-jtpVMuBnw 序言 2017 ...

  9. python决策树可视化_「决策树」| Part3—Python实现之可视化

    文章首发于微信公众号:AlgorithmDeveloper,专注机器学习与Python,编程与算法,还有生活. 1.前言 「决策树」| Part2-Python实现之构建决策树中我们已经可以基于给定数 ...

最新文章

  1. mysql按升序创建索引_Mysql中的降序索引底层实现
  2. 【下载!】实时计算正当时!助你轻松get Apache Flink 动向!
  3. 用EnumMaps映射枚举键
  4. 浅谈分布式存储中的网络通信
  5. Idea加快开发的10个技巧
  6. 10-R语言文本挖掘tm包详解
  7. python分行打印list_python如何用print打印出列表
  8. 关于asp.net文件下载基本操作
  9. ”此网站尚未经过身份验证“问题的解决办法
  10. Win10鼠标右键添加CMD选项
  11. html透明表单登录注册页面源码
  12. 字体设计中什么是断笔设计啊
  13. P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp
  14. webfunny埋点漏斗功能
  15. 2008年6月中国城市房价排行
  16. 安装配置python环境
  17. BZOJ3590【状压DP】
  18. my sql 新增 删除一列
  19. 反相器的电路结构和工作原理
  20. access 江苏计算机二级_计算机等级考试该选哪一科目?

热门文章

  1. 高德地图小蓝点_一会晴天一会下雨?夏日想要顺利出行 高德地图这些小功能最实用...
  2. JPEG算法概述及实现
  3. MMD_5a_Clustering
  4. Single Molecule Real-Time Sequencing
  5. 计算机技术的演进过程
  6. 测序技术有4个指标:读长、成本、准确度、通量
  7. Python之MySQL数据库增删改查操作
  8. mysql为什么直接8.0_为什么要迁移到MySQL8.0?
  9. windows10 ubuntu 无法连接到 无法建立到 raw.githubusercontent.com 的服务器 IP 地址,解决办法
  10. rabbitmq中的三种交换器(匹配模式)