当前位置: 首页 > news >正文

多重继承的虚函数表

同一个类,不同对象使用同一张虚函数表

不同类使用不同的虚函数表

子类自己添加的虚函数(非重写),在VS中是将此放在第一个继承类的虚函数表里.
在这里插入图片描述

#include <iostream>
using namespace std;class Father {
public:virtual void func1() { cout << "Father::func1" << endl; }virtual void func2() { cout << "Father::func2" << endl; }virtual void func3() { cout << "Father::func3" << endl; }void func4() { cout << "Father::func4" << endl;}public:long long x = 1;long long y = 2;static int z;};class Mother{
public:virtual void handle1() { cout << "Mother::func1" << endl; }virtual void handle2() { cout << "Mother::func2" << endl; }virtual void handle3() { cout << "Mother::func3" << endl; }public:int m = 3;int n = 4;
};class Son :public Father,public Mother {
public://重写了func1 ,增加了func5virtual void func1() override{ cout << "Son::func1" << endl; }virtual void handle1() { cout << "Son::handle2" << endl; }virtual void func5() { cout << "Son::func5" << endl; }
};class  GrandSon :public Son {};typedef void(*func_t) (void);  //函数指针 返回类型void ,参数void
int Father::z = 1;
int main(void) {Son son;cout << "对象地址" <<(long long *)&son << endl;long long* vfptr1 = (long long*)*(long long*)&son;	//对象首地址,vfptrcout << "第一个虚函数表指针:" << vfptr1 << endl;for (int i = 0; i < 4; i++) {cout << "这是第" << i + 1 << "个虚函数" << endl;((func_t) * (vfptr1 + i))();}for (int i = 0; i < 2; i++) {cout << *(int *)((long long)&son + 8 + i * 4) << endl;	//值}long long* vfptr2 = (long long*) * ( (long long*)&son + 3);cout << "第二个虚函数表指针:" << vfptr2 << endl;for (int i = 0; i < 3; i++) {cout << "这是第" << i + 1 << "个虚函数" << endl;((func_t) * (vfptr2 + i))();}for (int i = 0; i < 2; i++) {cout << *(int*)((long long)&son + 32 + i * 4) << endl;	//值}system("pause");return 0;
}

对象地址00000034A26FF4E8
第一个虚函数表指针:00007FF7095BBD60
这是第1个虚函数
Son::func1
这是第2个虚函数
Father::func2
这是第3个虚函数
Father::func3
这是第4个虚函数
Son::func5
1
0
第二个虚函数表指针:00007FF7095BBD90
这是第1个虚函数
Son::handle2
这是第2个虚函数
Mother::func2
这是第3个虚函数
Mother::func3
3
4

有一个错误:Father的x,y,一开始定义成了int,老师解答,long long * + 3 是加3个 long long ,

http://www.lryc.cn/news/14166.html

相关文章:

  • 第11篇:Java开发工具使用和代码规范配置
  • Rust模式匹配
  • GIT:【基础一】必要配置和命令
  • 黑马程序员-Linux系统编程-01
  • Python|每日一练|动态规划|图算法|散列表|数组|双指针|单选记录:不同路径|求两个给定正整数的最大公约数和最小公倍数|删除有序数组中的重复项
  • Java常用框架(一)
  • 基于 DSP+FPGA 的高清图像跟踪系统研制
  • apisix部署
  • 无聊小知识01.serialVersionUID的作用
  • pytorch搭建手写数字识别LeNet-5网络,并用tensorRT部署
  • 扬帆优配|五千亿巨头一度涨停! 4天3倍,港股又现“狂飙”股!
  • RocketMQ之(一)RocketMQ入门
  • 推荐系统[三]:粗排算法常用模型汇总(集合选择和精准预估),技术发展历史(向量內积,WideDeep等模型)以及前沿技术
  • vue3 + vite 使用 svg 可改变颜色
  • SQL82 返回 2020 年 1 月的所有订单的订单号和订单日期
  • vulnhub zico2
  • 处理窗口的常用API函数及窗口处理经验总结(附源码)
  • @TableId注解详细介绍
  • kubectl常用的命令
  • Linux 配置远程SSH服务(密码+密钥)
  • WuThreat身份安全云-TVD每日漏洞情报-2023-02-20
  • 面试经常被问悲观锁和乐观锁?什么是cas?来我花3分钟时间告诉你
  • React源码分析3-render阶段(穿插scheduler和reconciler)
  • 3功能测试心得分享
  • Python-推导式
  • 操作系统线程
  • vue3中如何定义响应式变量
  • 【C++修炼之路】20.手撕红黑树
  • 树状数组(高级数据结构)-蓝桥杯
  • Flink-多流转换(Union、Connect、Join)