C++隐藏规则再分析

Unidbg逆向阿里系App签名:从环境补全到算法还原实战 在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算 阅读详情

一.序言
前面一篇区分了重载/覆盖/隐藏,那么这一篇先给一个magic的例子。

class Base
{
    public:
        virtual void f(float a){cout<<"Base::f_float"<<endl;}
        void g(float a){cout<<"Base::g_float"<<endl;}
        void h(float x){cout<<"Base::h_float"<<endl;}

};
class Der : public Base
{
    public:
        void f(float a){cout<<"Der::f_float"<<endl;}
        void g(int a){cout<<"Der::g_int"<<endl;}
        void h(float a){cout<<"Der::h_float"<<endl;}
};
int main()
{
    Der d;
    Base *pb = &d;
    Der *pd = &d;
    pb->f(3.14f);//Der::f_float,覆盖
    pd->f(3.14f);//Der::f_float,正常
    cout<<"--------------->"<<endl;
    pb->g(3.14f);//Base::g_float,这就是隐藏与覆盖的区别,如果是覆盖的情况的话,打印出来的应是Der::g_int.由于是父类指针调用父类的g函数,隐藏只是子类的方法隐藏父类,当子类调用时,不受父类同名方法的影响;
    pd->g(3.14f);//Der::g_int,隐藏
    cout<<"--------------->"<<endl;
    pb->h(3.14f);//Base::h_float,同pb->g(3.14f)情况
    pd->h(3.14f);//Der::h_float,隐藏
}

先看结果
这里写图片描述

每种情况的分析请见代码

二.隐藏规则存在的意义

class Base
{
public:
    void f(int x){cout<<"Base::f_int"<<endl;};
};
class Der : public Base
{
public:
    void f(char *str){cout<<"Der::f_char*"<<endl;}
};
int main()
{
    Der d;
    d.f(10);//error,从类型‘int’到类型‘char*’的转换无效
}

也许你的本义是想调用函数Base::f(int a),但是它被隐藏掉了。由于整型10不能隐式的转化成char*类型,所以编译时报错。
但是你不能因为这就说C++的隐藏特性没有用。给出理由:

(1)也许我本来就是想调用Der::f(char *str);恰好因为C++的隐藏规则指出了我的错误。
(2)如果Der类继承了多个父类(多重继承),最后谁也不知道哪个父类里定义了f函数,如果没有隐藏规则,会很莫名其妙的调用某个f函数。隐藏可以避免这些意外的发生

如果一定要调用Base::f(int),可以这样修改代码

class Der : public Base
{
public:
    void f(char *str){cout<<"Der::f_char*"<<endl;}
    void f(int a){Base::f(a);}
};
ICC2:使用analyze_lib_cell_placement检查lib cell的pass rate 我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?在place之前需要使analyze_lib_cell_placement命令去检查lib cell在当前的site row/power plan/legalize设置的环境下能够正常place和legalize。下面分享一个脚本去报告pass rate低于2%的lib cell。 阅读详情

相关推荐

卷积码和Turbo码

通信原理相关博文目录:目录我们常在移动通信中遇到的卷积码就是一种非分组码,卷积码和信号处理中的卷积运算有关系吗?是不是就是信号处理中的卷积运算,先看看编码器的编码原理再说:下面是一个比较实用的卷积码编码器:它有三个移位寄存器D0,D1,D2和三个模2加法器,以及一个旋转开关组成,编码前,先将各级移位寄存器清零:现在假设输入的信息码元是1101:当输入的第一个码元为1时,三个模2加法器计算的结果都为...

Reborn Lee 2万+

关于C++的隐藏规则

关于C++的隐藏规则: 我曾经听说过C++的隐藏规则: (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。 #include class Base { pu

知至智 903

基于CNN的表情识别(FER)pytorch实现

Report for FER Jian Tang Abstract 我们使用卷积神经网络(CNN)实现了baby的面部表情识别(FER)。 数据上,我们获取了开源FER数据集FER2013[1],besides我们使用爬虫获取了baby相关的人脸图片,进行了手工分类标注以形成一个全新的baby FER数据集。 模型上,我们首先复现了Luan[2]的工作,即参考Kuo[3]在CVPR 2018上的工作并实现一个轻量的CNN网络,在FER2013上进行训练并得到了XXXX%的平均分类准确率(avg a

qq_20241587的博客 3683

C++中的重载、覆盖、隐藏机制

先讨论一下重载(Overload)的含义,在同一可访问区内被声名的几个具有不同参数列的(参数的类型、个数、顺序不同)同名函数,程序会根据不同的参数列来确定具体调用哪个函数,这种机制叫重载, 重载不关心函数的返回值类型。这里,“重载”是“重复”、“重叠”的意思。例如在同一可访问区内有: ① double calculate(double); ② double calculate(double

haoxingfeng的专栏 1132

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文全面解析了青龙人形机器人硬件平台的设计与实现,涵盖构型设计、驱动系统、能源方案及控制系统等核心模块。重点介绍了43个自由度的仿生学实践、关节模组的技术突破以及多模态感知融合等创新设计,为开发者提供了从理论到实战的完整指南。

embedding5hiker的博客 890

YOLO与ORB-SLAM3的结合:实现动态环境下的目标检测与视觉SLAM

摘要: 本文介绍如何将YOLOv5目标检测与ORB-SLAM3视觉SLAM系统结合,实现动态环境下的机器人感知与定位。内容包括:源码下载(集成项目YOLO_ORB_SLAM3)、libtorch安装(PyTorch C++支持)、编译配置(解决路径依赖问题)、ROS环境下的部署(Noetic适配),以及使用TUM数据集的测试流程(RGB-D数据关联与运行)。重点解决编译时Torch路径错误、ROS与Anaconda冲突等问题,并展示系统运行效果。该整合方案为动态场景SLAM提供目标检测能力,未来可优化检测模

FJN110的博客 962

不可不知的C++隐藏规则

在面向对象的开发过程中,经常出现类的继承,这里面出现的成员函数的重载(overload)、覆盖(override)与隐藏(hidden)很容易混淆。首先澄清这3个概念:重载相同的范围(在同一个类中)函数名字相同参数不同virtual 关键字可有可无覆盖(派生类函数覆盖基类函数)不同的范围(分别位于派生类与基类)函数名字相同参数相同

daniel_h1986的专栏 8721

LDRA Testbed(TBrun)软件单元测试_实例讲解(对多次调用的函数打桩)

在之前的文章《LDRA Testbed(TBrun)软件单元测试_操作指南》中,已经讲解了如何使用TBrun进行软件单元测试的基本操作步骤。本篇文章将结合实例进一步讲解被测函数中包含多次调用其他函数时,如何对其打桩来实现测试目的(详细的操作流程本文不再重述,若有不清楚的,可以结合之前的操作指南一起来看)。本文以一个被测函数作为示例,讲解了如何使用Testbed(TBrun)对涉及到多次调用其他函数的被测函数进行单元测试。本文的示例可能比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1463

c++隐藏

今天才知道c++继承里面的隐藏特性,真是孤陋寡闻了。 #include <iostream> using namespace std; class A { public: void print() {cout<<"A"<<endl;} }; class B:public A { public: void print(int a) ...

Sundrops的专栏 3030

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7753

军品研制过程评审活动-(一)论证阶段

军品研制过程评审活动-(一)论证阶段

Abel的博客 3815

同名成员到底调用谁?C++ 隐藏规则你真的会吗?

本文介绍了C++面向对象编程中的继承特性。首先通过Student和Teacher类的冗余代码示例,展示了继承如何实现代码复用。接着详细讲解了继承的定义格式、三种继承方式(public/protected/private)及其访问规则变化,重点强调实际开发中应优先使用public继承。文章还演示了继承类模板的实现方法,并以stack为例比较了继承与组合的不同实现方式。最后解释了基类和派生类之间的转换规则,通过"父子关系"类比说明派生类可赋值给基类(切片),而基类不能直接赋值给派生类。

分享 AI 时代程序员的进阶之路:大模型应用、AI 编程工具实战,同时沉淀 C / Linux 底层技术笔记。与君共赴,万里征途。 736

把 Custom Business Configurations 变成你的定制化维护台:Business Configuration Maintenance Object 设置全解

摘要:SAP BTP的Business Configuration(BCMO)为ABAP环境提供标准化的配置维护方案,通过RAP对象暴露为OData V4服务,自动生成Fiori elements维护界面,省去单独开发应用的成本。关键配置包括:Service Configuration定义业务名称和分组;List Report控制初始加载和视图变体;Object Page配置布局(Tabs/Page)和编辑权限;Table Settings选择表格类型(Grid/Responsive)和创建模式(Inlin

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 171

C++父类与子类关系以及函数重载、覆盖和隐藏规则

今天去HTC面试,笔试考了逻辑、c语言、c++语言几个部分,C/C++考的全是基本语法,没有考算法。C语言部分做的还不错,C++部分却做的那么多不确定,其中大部分是C++父子类之间关系以及函数重载、覆盖以及隐藏规则。 在C++语言中,虚函数是非常重要的概念,虚函数是实现C++面向对象中多态性和继承性的基石。而多态性和继承性则是面向对象语言的精髓。掌握虚函数才算是真正掌握C++语言,而C++语言中

清闲老窝的专栏 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++中的虚函数的隐藏规则

在编程中遇到一个奇怪的问题, 在继承类无法调用基类中定义的一个public函数, 编译时总是说函数调用的参数表不正确, 很是郁闷. 在网上搜索之后, 发现原因是:   在基类中有定义有多个同名的函数(例如exec), 但参数表是不同的, 其中一个是虚函数, 在继承类中实现. 这样的话, 在继承类中就无法调用基类中定义的其他exec函数(只有继承类中重载的exec函数才可调用), 这是由C++中的

Lutx的专栏 2415

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

类型兼容规则和隐藏规则

类型兼容规则:共有派生类替代基类对象。赋值,引用,指针。隐藏规则: 在没有虚函数的情况下,如果派生类中声明了与基类成员函数同名的新函数即使函数的参数表不同,从基类继承的同名函数的所有重载               形式也都会被隐藏A1共有派B1,B1共有派生C1 #include #include using namespace std;class A1{

小桥流水人 898

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

令人迷惑的隐藏规则

在校大学生(C/C++) 303

c++ 隐藏规则

关于c++隐藏规则的简单理解

菜鸟也疯狂 826

C++:同名隐藏和赋值兼容规则

一、同名隐藏 同名隐藏,即在C++的继承中,只要子类的函数名和父类的函数名相同,子类中的函数将会隐藏所有父类中和子类的成员函数同名的函数 特别注意: 和函数之间的重载不同,这里只要求函数的名字相同,而对函数的参数列表是否相同不做要求。话句话说父类中和子类的成员函数名相同但参数列表不同的成员函数也会被隐藏 示例: 1 #include<iostream> 2...

weixin_38607041的博客 555

C++隐藏规则

C++函数有重载、覆盖和隐藏,隐藏容易与重载和覆盖混淆。 隐藏的规则如下: (1)如果派生类的函数与基类的函数同名,但是参数不同。此时无论有没有virtual关键字,基类的函数都将被隐藏。(注意别与重载混淆) (2)如果派生类的函数与基类的函数同名,而且参数相同,但是基类的函数没有virtual关键字,此时基类的函数将被隐藏。(注意别与覆盖混淆)

奋斗史 472

C++中的隐藏规则

C++中的隐藏规则如果派生类的函数与基类的函数同名,但是参数不同,此时,无论有无virtual关键字,基类的函数将被隐藏(重载是一个类中有同名的函数) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时,基类的函数被隐藏(覆盖是指基类函数有virtual关键字) #include <iostream> using namespace std;

test 1408

C++ 隐藏

派生类中声明了一个与基类同名的函数 为什么会隐藏?

qq_62015542的博客 854

【C++】继承中的作用域——隐藏规则

继承中的隐藏

Admin__z的博客 417

《别再被 C++ 继承绕晕!从隐藏规则到虚继承,一篇理清所有混乱》

摘要:C++继承机制解析 C++继承机制通过基类与派生类的层级关系实现代码复用和层次化设计,但存在诸多易混淆点:1)继承方式(public/protected/private)会影响基类成员在子类中的访问权限,优先使用public继承;2)子类同名成员会"隐藏"基类成员,需显式指定基类::成员访问;3)派生类构造/拷贝/赋值时需显式处理基类部分;4)切片规则允许子类对象赋给基类指针/引用,但反向转换需谨慎。此外,菱形继承涉及虚继承解决数据冗余问题。理解这些核心机制能有效避免继承陷阱。

2403_87581574的博客 989
上一篇: C++中重载/覆盖/隐藏的区别分析
下一篇: C++中虚析构函数的作用及其原理分析
逐鹿之城
博客等级 码龄11年 240粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值