C++之private虚函数

2023-10-30

一般我们说虚函数,它的访问级别都是public的,用类对象可以直接调用,这样就可以实现运行时的类型绑定,那如果我们将虚函数私有化会出现什么情况呢?

我们先来看一个非虚函数私有化的例子

class Base
{
private:
    void PrintClassName ()
    {
        cout<<"Base"<<endl;
    }
public:
    void print()
    {
        PrintClassName();
    }
};

class Derived : public Base
{
private:
    void PrintClassName()
    {
        cout<<"Derived"<<endl;
    }
};

在main函数里产生一个Derived的对象d,然后调用print()函数,即d.print(),结果输出的却是Base,print()函数没有调用子类的PrintClassName函数,而是调用父类的PrintClassName函数,原来是由于PrintClassName函数不是虚函数之故,所以Base的print()函数调用PrintClassName()函数是在编译时就已经绑定了,而不是运行期绑定。

下面我们让PrintClassName()函数变成虚函数再执行,就可以看到输出的类名为子类的名称,即Derived。

那么我们有没有办法调用私有的虚函数呢?当然是有的,不管公有还是私有,只要是虚函数,它的函数地址都会放在虚函数表vftable中,只要我们找到虚函数表中存放的PrintClassName()函数的地址,我们就可以直接调用,前提是你必须对C++类对象的内存布局要熟悉,代码如下,这样也输出Derived,与前面效果相同

int _tmain(int argc, _TCHAR* argv[])
{
    
    Derived d;
    //d.print();
    typedef void (*Fun)();
    Fun pFun = NULL;
    pFun = (Fun)*((int *)(*(int *)&d + 0) + 0);
    pFun();

    getchar();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之private虚函数 的相关文章

随机推荐

  • Mac OS X系统偏好设置某些功能点不动(灰色)的解决方法

    原文链接 http walkingtowel org 2010 02 25 accessing mac os x leopard greyed out preference panes 问题描述 将鼠标停在灰色的icon上显示 您的系统管理
  • 如何将本地的mongodb数据导出,然后上传至阿里云服务器上mongodb中呢?

    1 使用MongoDB Compass 可视化工具将本地数据库导出 Collection gt Export Collection 2 将本地导出的mongodb数据库表上传至服务器上的任意位置 我使用的是Yummy FTP Pro 我上传
  • C终端获取终端数据

    写在前边 关于C语言从键盘获取数据 常用的有scanf gets getchar fgets等等 但是scanf gets getchar等函数不会对输入的数据进行检查 会导致程序崩溃 所以一般都用fgets获取数据 fgets问题 fge
  • 【并发编程】1、简介

    并发编程 简介 1 并发的出现 1 1 引入 计算机的出现改变了我们的生活呀 但在早期的计算机计算的效率与成本非常的高 基本上只能用于军方与有钱家庭 每个人都只能将自己写好的代码放到计算机上 计算完成后才能让下一个人继续使用计算机 就相当于
  • WY37 - 操作序列 - 网易

    java实现 题目描述 小易有一个长度为n的整数序列 a 1 a n 然后考虑在一个空序列b上进行n次以下操作 1 将a i放入b序列的末尾 2 逆置b序列 小易需要你计算输出操作n次之后的b序列 输入描述 输入包括两行 第一行包括一个整数
  • 如何将eclipse的英文设置成中文?

    点击eclipse选项栏中的 help 项 选择 install new solftware 可以看见如下界面 选择 添加 出现Add Repository界面 在名称处填写 babel 位置处粘贴如下库 https download ec
  • FPGA中的AXI总线

    网上有很多介绍AXI的文章 本篇或多或少参考了一些 其中的一些内容是我自己的理解 我认为比较适合新手 希望能帮助到才接触FPGA的萌新 一 AXI简介 AXI Advanced eXtensible Interface 直译过来就是先进的可
  • NEON优化:ARM优化高频指令总结

    NEON优化 ARM优化高频指令总结 前言 读写 计算 转换 操作 参考资料 NEON优化系列文章 NEON优化1 软件性能优化 降功耗怎么搞 link NEON优化2 ARM优化高频指令总结 link NEON优化3 矩阵转置的指令优化案
  • 保姆级vmware workstation Pro17安装紫色kali linux(KALI PURPLE)

    官方文档如下 官方文档 https gitlab com kalilinux kali purple documentation wikis home 虚拟机安装 下载vmware workstation Pro17 一路下一步安装完成 h
  • 使用python实现淘宝抢购

    疫情当下 大部分人选择网购 但是在有限数量的网购商品时 大家就需要蹲点抢了 而蹲点也不一定比别手快 有什么方法可以实现自动蹲点抢购呢 使用方法 1 先把想抢购的商品加入淘宝手机端的购物车 2 修改代码中抢购时间 3 运行代码 4 弹出浏览器
  • Flutter学习第三课-布局组件 Row和Column

    线性布局 所谓线性布局 即指沿水平或垂直方向排布子组件 Flutter中通过Row和Column来实现线性布局 Row 水平布局 Column 垂直布局 Row 和 Column 组件是不可以滚动的 所以在 Row 和Column 组件中不
  • 减少代码重复率的方法

    1 使用设计模式 设计模式的可以提高代码的复用率 减少代码的重复度 2 使用类模板或者函数模板 所谓的泛型编程
  • Python开发之DataFrame数据的多种遍历方法

    Python开发之DataFrame数据的多种遍历方法 1 遍历DataFrame的三种方法 2 按列遍历 3 按行遍历 3 1 第一种方法 3 2 第二种方法 4 遍历DataFrame某一列 行 数据 4 1 获取frame的index
  • Linux下输出彩色字符

    在 ANSI 兼容终端 例如 xterm rxvt konsole 等 里 可以用彩色显示文本而不仅仅是黑白 但是我们自己编写的程序能否输出彩色的字符呢 当然答案是肯定的 下面的语句就输出高亮的黑色背景的绿色字 printf 033 1 4
  • 【转载】keil消除*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS警告方法

    在Keil C中 如果没有显式调用到定义过的函数 就会出现这样的的警告 当出现这样的警告时 可以不用管 因为不影响其它部分 但是 我们知道 即使没有调用这个函数 Keil仍然把它编译连接进整个程序 不过浪费点ROM倒是不心疼 最主要的是 在
  • 京东高级Java现场面试37题:页锁+死锁+集群+雪崩+负载等

    京东现场三面面试题目 文末有福利 各大互联网公司经典面试题目及答案 京东一面 介绍一下自己 项目参与的核心设计有哪些 ArrayList和LinkedList底层 HashMap及线程安全的ConcurrentHashMap 以及各自优劣势
  • C语言--八大排序之希尔排序算法

    希尔 shell 排序 分组后 间隔式的分组 利用直接插入排序 简单来说就是 插入排序是间隔为一的数字之间进行比较 但希尔排序是间隔为gap的数字为一组 先进行一次插入排序 再不断缩小gap的值 重复以上操作 直到最后一个gap的值为1 分
  • C语言中求最大公约数的算法(三种)

    利用指针把三个数从大到小输出 最大公约数 指某几个整数共有约数中最大的一个 方法一 相减法 也叫更相减损法 思路 1 如果a gt b a a b 2 如果b gt a b b a 3 假如a b 则 a或 b是最大公约数 4 如果a b
  • 第一课:前言

    大家好 欢迎来到我的网站 人工智能被认为是一种拯救世界 终结世界的技术 毋庸置疑 人工智能时代就要来临了 科幻电影中的场景将成为现实 未来已来 我很庆幸 十四年前就认定了人工智能专业 一路学习着 从国内学到了国外 然后又回到了祖国参加工作
  • C++之private虚函数

    一般我们说虚函数 它的访问级别都是public的 用类对象可以直接调用 这样就可以实现运行时的类型绑定 那如果我们将虚函数私有化会出现什么情况呢 我们先来看一个非虚函数私有化的例子 class Base private void Print