C++复习之多态

Reluplex:一种用于验证深度神经网络的高效的SMT求解器 Reluplex:一种用于验证深度神经网络的高效的SMT求解器摘要背景介绍背景知识从Simplex到Reluplex高效实现Reluplex案例研究:ACAS Xu系统评估过程总结和未来工作 文献来源:Guy Katz, Clark W. Barrett, David L. Dill, Kyle Julian, and Mykel J. Kochenderfer. Reluplex: An efficient SMT solver for verifying deep neural networks. In 阅读详情

前两天面试的时候,刚好多态没看到。。。。多年没有用过(其实也就两年。。。QAQ),全线崩盘,so,认认真真的开始了复习。

首先,多态解决的问题就是派生类和基类有同名函数的情况下,如果都用基类的指针来指向二者的对象,那么该函数都会执行基类的函数。

举个栗子:

#include <iostream>      
using namespace std;    

class Vehicle 
{    
public:    
    Vehicle() {}
    void ShowMember() 
    { 
        cout << "Parent"<<endl; 
    } 
};    
class Car:public Vehicle    
{    
public:    
    Car() { }
    void ShowMember() 
    { 
        cout<<"child" << endl; 
    } 
};    

void test(Vehicle &temp) 
{ 
     temp.ShowMember(); 
} 
int main()    
{ 
    Car c;
    Vehicle v; 
    test(c);
    test(v);
    return 0;
}

此处Vehicle是基类,Car是派生类,两者都有同样的方法——ShowMember(),如果用一个基类指针指向这两个类的实例,会出现以下的情况:
这里写图片描述
就是派生类对象在执行这个函数的时候,选择了基类的版本而没有选择自己的。
所以,为了让它在被基类指针指向的时候仍然能够保持自己特性,选择采用多态的方法~
所以呢,要在基类的那个函数那里加上virtual关键字使它成为一个虚函数,然后就看看现在怎么样了:
这里写图片描述
成功了!
需要注意的问题有:
虽然方法在基类中声明了它自己是虚的以后在派生类中会自动成为虚方法。However,在派生类中强调一下也是一个好习惯吧~
另外一个问题,基类应该包含一个虚析构函数(注意构造函数好像不能为虚),因为如果使用了new和delete的话,析构函数不为虚,只会调用基类的析构函数,尽管它是一个派生类对象。

Dynamic binding and Static binding

Static binding:编译时确定将源代码中的函数调用解释为执行特定函数代码块。
Dynamic binding:运行时。(eg.多态)

隐式强制向上转换使基类指针或引用可以指向积累对象或者派生类对象,因此需要dynamic binding。
注意:如果是按值传递的话,比如,
void test(Vehicle v1) {
v1.ShowMember();
}
Car c;
Vehicle v;
test(c); //uses Vehicle::ShowMember();

所以,按值传递只将Car对象的Vehicle部分传递给了函数test()。

编译器对非虚方法采用的是static binding。

虚函数的工作原理(P504)

C++规定了虚函数的行为,但是将实现方法留给了编译器
通常,实现方法为:
给每个对象添加一个隐藏的成员,隐藏成员中保存了一个指向函数地址数组的指针。这种数组称为虚函数表.虚函数表中存储了为类对象进行声明的虚函数的地址。基类对象包含一个指针,指向基类中所有虚函数的地址表,派生类如果重新定义了虚函数,那么就把自己虚函数表中的函数地址改了(直接替换),如果新定义了新的虚函数,也把地址加入数组中。调用虚函数是,程序先查看存储在对象中的虚函数表的地址,然后转向相应的函数地址表。

使用虚函数时,
每个对象将增加存储地址的空间
对于每个类,编译器都创建一个虚函数地址表(数组);
对于每个函数调用,都需要执行一项额外的操作,在表中查找地址。
注意:以上成本均为使用虚函数时产生的。

再次声明:构造函数不能为虚函数,析构函数则需要定义为虚函数。要不然派生类中的对象就无法释放了。

只有成员函数才可以被声明为虚函数,友元不可以。

虚函数重新定义只能修改返回值,不能修改参数(修改参数不如直接重载,orz…)

Reluplex代码阅读 本文来源:Reluplex: An Efficient SMT Solver for Verifying Deep Neural Work Guy Katz, Clark Barrett, David L. Dill, Kyle Julian, and Mykel J. Kochenderfer Stanford University, Stanford USA 解决的主要问题 在安全... 阅读详情

相关推荐

几种流行的神经网络形式化验证器的比较

截止到2021年8月,国际上最优秀的几种神经网络形式化验证器: 工具名称 适用网络 特点 优点 缺陷 文献名称及出版时间 Venus 基于ReLU的前馈神经网络 - 基于MILP求解器- 支持生成反例 利用ReLU节点之间依赖关系,修剪基于MILP公式的验证问题的搜索树,大大缩短的验证过程的时间 只能应用于ReLU激活函数的神经网络 Efficient Verification of ReLU-based Neural Networks via Dependency Analysis, 20

GGG_Yu的博客 1624

C++多态中级复习

C++多态中级复习

C/C++ 941

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4005

C++多态(复习)

重定义(隐藏)是指两个函数分别在基类和派生类的作用域,这两个函数的函数名相同。若两个基类和派生类的同名函数不构成重写就是重定义。

qq_73955920的博客 392

【C++面向对象程序设计期末复习】——多态

为不同数据类型的实体提供统一的接口,或使用单一符号表示多种类型。

yinan_0916的博客 1329

Reluplex---An Efficient SMT Solver for Verifying Deep Neural Networkd

Reluplex---An Efficient SMT Solver for Verifying Deep Neural Networkd

C++多态基础复习

C++多态基础

C/C++ 1012

论文研究-SMT技术在国内外的发展 .pdf

SMT技术在国内外的发展,沈明芳,史月丽,本文叙述了表面安装技术(SMT)的基本概念、发展历史、应用设备及相关技术工艺。详细介绍了SMT技术在世界各国的发展情况,其中以欧

C++ 多态 复习笔记

多态概念: 虚函数: 虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中再定义的函数。虚函数的特点是,只要定义一个基类的指针,就可以指向派生类的对象 虚函数重写---当在子类中定义了一个与父类相同的虚函数时,则称子类的这个函数重写了父类的这个虚函数 虚函数虚在“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被...

fistraiser的博客 310

关于Relu文章的理解翻译Deep Sparse Rectifier Neural Networks

关于Relu文章的理解翻译,原文见paper:Deep Sparse Rectifier Neural Networks

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

m0_72224305的博客 4306

关于C++多态的复习总结

关于C++多态的复习总结

m0_62126248的博客 1123

5分钟搞定JY901S与STM32通信:硬件I2C+DMA配置全流程(附OLED显示教程)

本文详细介绍了如何通过STM32硬件I2C接口配合DMA高效读取JY901S姿态传感器数据,并实现OLED实时显示。文章从硬件连接、I2C与DMA配置、通信协议解析到数据可视化,提供了完整的实战流程和避坑指南,帮助开发者快速构建高精度、低CPU占用的姿态感知系统。

weixin_29185167的博客 482

【c++复习笔记】——多态详细解析,多态的原理,多态的笔试题

💂 个人主页:努力学习的少年 🤟 版权:本文由【努力学习的少年】原创、在优快云首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 ​

sjp11的博客 6079

python基于语音识别的智能垃圾分类系统

大家好我是蓝天,混迹在java圈的辛苦码农。今天要和大家聊的是一款《python基于语音识别的智能垃圾分类系统》毕业设计项目。项目源码以及部署相关请联系蓝天,文末附上联系信息。🎈作者:蓝天🎈🎈个人简介:精通 Java、Python、C#、C、C++ 等编程语言,同时对微信小程序、Php 和 Android 等技术也能熟练掌握,可为大家提供全面的技术支持与交流。我拥有丰富的成品 Java、Python、C# 毕业设计项目经验,能够为学生提供各类个性化的开题框架及实际运作方案。🎈。

Chujun123528的博客 660

【backtrader保姆级教学】投资组合回测

method1:探索投资组合的最有方案,使用蒙特卡洛模拟Markowitz模型。# 提取最小波动组合对应的权重, 并转换成Numpy数组。# 绘制收益-标准差的散点图,并用颜色描绘夏普比率。# 在收益-风险散点图中突出风险最小的点。:param any_day: 任意日期。# 将该点坐标显示在图中并保留四位小数。password = “替换密码”# 找到标准差最小数据的索引值。user = “替换账号”# 计算GMV投资组合收益。# 计算每项资产的夏普比率。# 设置无风险回报率为0。

weixin_38132951的博客 2315

c++关于多态的复习整理

c++关于多态的复习整理一、静态联编二、动态联编(多态)三、纯虚函数和虚析构 一、静态联编 1、将源代码中的函数调用解释为执行特定的函数代码被称为函数名联编 2、根据函数名选择对应的函数体执行,但是在C++有函数重载所以这必须还要看函数的参数及函数名才能确定使用那个函数 3、这种可以在编译过程就完成的这种编译(静态联编) #include<iostream> using namespace std; class Animal { public: void eat(); }; class Dog

qq_45930294的博客 411

泛微OA表单设计实战:如何快速实现自定义多选浏览框(附完整配置步骤)

本文详细介绍了在泛微OA中快速实现自定义多选浏览框的完整配置步骤。针对招聘提报、活动审批等需要从海量数据中规范选择多个条目的业务场景,文章从理解需求、构建数据源、设计查询页面到创建浏览框控件,提供了清晰的实战指南,帮助开发者高效解决复杂数据选择难题,提升表单操作体验。

yog99的博客 1049

C++继承,多态复习

这里写目录标题一级目录 一级目录

loreal8的博客 194

机器人视觉实战:用OpenCV搞定手眼标定(附完整C++代码)

本文详细介绍了使用OpenCV实现机器人视觉中的手眼标定技术,包括核心算法、工业场景优化及完整C++代码示例。通过解析坐标系转换问题,提供从数据采集到标定验证的全流程解决方案,帮助开发者在复杂工业环境中实现高精度机械臂与视觉系统的协同作业。

weixin_29306571的博客 481

深入解析CAN总线BusOff故障的检测与恢复机制

本文深入解析了CAN总线BusOff故障的检测与恢复机制。BusOff是CAN节点因发送错误过多而被强制离线的一种严重状态。文章详细阐述了其触发原理,即发送错误计数器(TEC)超过255,并重点介绍了通过软件实现的快慢恢复机制,以增强网络在异常情况下的稳定性和韧性。

weixin_29158047的博客 525

C++复习_多态

父类纯虚函数实现、子类虚函数重写加需求、子类中堆区创建对象在重写中输出(创建string*即指针类型的子类成员变量、在子类构造函数中通过new在堆区创建name对象用子类创建的指针类型成员变量接收,最后在虚函数中解引用输出)、测试函数中创建父类指针指向new出的子类对象,并传入name、指针调用子类虚函数、手动delete子类对象。(2)当父类引用指向子类对象时,也即发生多态时,传入一个子类对象,调用虚函数,此时记录虚函数的地址已经发生替换,所以调用子类的虚函数,完成多态。

qq_45063488的博客 916

避坑指南:PyCINRAD处理CINRAD雷达数据时遇到的5个典型报错及解决方案

本文针对使用PyCINRAD库处理CINRAD雷达基数据时常见的5个典型报错,提供了详细的解决方案。内容涵盖环境配置、数据读取、PPI可视化及性能优化等核心环节,重点解决了版本兼容性、数据异常处理和中文乱码等实际问题,帮助用户高效处理雷达基数据并生成准确的PPI图像。

cc789的博客 1068

C++多态的复习

1.继承 访问控制和继承 派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。 我们可以根据访问权限总结出不同的访问类型,如下所示: 访问 public protected private 同一个类 yes yes yes 派生类 yes yes no 外部

rainlua的博客 251

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

【C++复习】多态{深入理解多态底层}

介绍 windows下堆栈相对位置 析构函数 复习override和final和重载/重定义/重写 抽象类 多态原理 回顾虚基表指针 单继承多态底层 打印虚函数表 多继承多态底层 c++输出类成员函数地址 再次理解多态 早期绑定/晚期绑定

Ape's IT Blog 1072

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 牛客网错题归纳3.15
下一篇: 系统分析与设计第3周作业
迈出第一步就好了
博客等级 码龄9年 4粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值